[英]Set value using signal is not behaving as expected in Qt
我在主线程中有一个类可以启动另一个线程。 从创建的线程中,我向主线程发送信号以获取QWebView的当前documentElement,并且主线程对该线程进行回复并在该线程中设置本地QWebElement变量。 因此,这是一些代码:
线程有:
...
public slots:
void setCurrentElement(QWebElement aElement);
signals:
void sgGetCurrentElement(void);
private:
QWebElement currentElement;
主线程有:
...
public slots:
void onGetCurrentElementReceived(void);
signals:
void sgResponseToGetElement(QWebElement aElement);
创建线程后,我将信号连接到插槽,例如:
connect(insExtractor, SIGNAL(sgGetCurrentElement()), this, SLOT(onGetCurrentElementReceived()));
connect(this, SIGNAL(sgResponseToGetElement(QWebElement)), insExtractor, SLOT(setCurrentElement(QWebElement)));
一旦主线程从该线程接收到信号,它将执行以下操作:
void targetClass::onGetCurrentElementReceived(void)
{
emit sgResponseToGetElement(insWebView->page()->mainFrame()->documentElement());
}
线程中的setter执行以下操作:
void createdThread::setCurrentElement(QWebElement aElement)
{
currentElement = aElement;
}
这是问题所在:我的目标是找到ID为SubmitForm的第一个表单元素。 元素中有这种形式,那里没有问题。 如果我在发出主线程信号之前写了以下代码:QWebElement form_found = currentElement.findFirst(“ form [id ='submitForm']”);
form_found不返回null,而是查找form元素。 没问题。 如果在线程中的setCurrentElement中设置currentElement之后立即编写相同的代码,它会执行相同的操作并找到表格。 但是,如果在线程中再次发出第一个信号后立即执行相同的操作,则它将返回null。 这是代码:
void createdThread::startExtracting(void)
{
sgGetCurrentElement();
QThread::msleep(2000);
QWebElement form_found = currentElement.findFirst("form[id='submitForm']");
}
因此,form_found为空。 谁能告诉我为什么它返回null? 我将日志放到任何地方,并在设置器中将其设置后被调用。 这有什么问题?
我的怀疑是您正在停止执行睡眠的线程的事件循环。
Qt中的线程有些棘手。 看看这个 ,它使所有这些问题很清楚。
我想说,当您确定得到Element
时,应该使用Element
,它位于setCurrentElement
。 为什么不从该方法开始提取呢?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.