使用信号的设定值在Qt中的表现不符合预期

Set value using signal is not behaving as expected in Qt

本文关键字:不符合 Qt 信号      更新时间:2023-10-16

我在主线程中有一个类,它启动另一个线程。从创建的线程中,我向主线程发送一个信号,以获取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。有人能告诉我为什么它返回null吗?我把日志放在各处,它在setter中设置后被调用。这是怎么回事?

我怀疑您正在停止执行睡眠的线程的事件循环。

Qt中的线程有点棘手。看看这个,它让所有这些问题都非常清楚。

我想说,当你确定你得到了Element,并且它在setCurrentElement上时,你应该使用它。你为什么不用那种方法开始提取呢?