繁体   English   中英

使用信号的设置值在Qt中表现不佳

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM