使用信号的设定值在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。有人能告诉我为什么它返回null吗?我把日志放在各处,它在setter中设置后被调用。这是怎么回事?
我怀疑您正在停止执行睡眠的线程的事件循环。
Qt中的线程有点棘手。看看这个,它让所有这些问题都非常清楚。
我想说,当你确定你得到了Element
,并且它在setCurrentElement
上时,你应该使用它。你为什么不用那种方法开始提取呢?
相关文章:
- 我可以在不使用Qt for Webassembly的情况下使用Emscripten编译Qt吗?
- 将 QByteArray 转换为无符号短:不符合预期
- 使用cmake(窗口)构建时不显示Qt资源
- 为什么此模板函数的行为不符合预期?
- 为什么 std::basic_ostream::运算符<<不符合 CONST 资格?
- 使用Cmake将插件安装到独立的Qt Designer(不是Qt创建者)中
- Qt视频流应用程序:找不到qt.mediaplayer的服务
- Qt5自定义QDialog,不使用qt创建器
- std::vector 构造initializer_list的行为不符合预期
- 如何将不在 QT 全局范围内的函数附加到 Qwidget 上
- C++使用 LZ4 进行压缩,压缩信息不符合预期
- 为什么 std::future::wait_for 的行为不符合预期?
- 为什么 Python 需要 DLL 中的 GetMessage 消息泵送,而不是 Qt
- 在Visual Studio 2017中使用Qt库的CMake项目:运行exe时找不到Qt dll
- Seekg 的行为不符合预期
- Int 附加到字符,行为不符合我的预期
- NDK r16b std::istringstream 的行为不符合预期
- 找不到QT Vulkan类
- 为什么std::is_copy_constructible的行为不符合预期
- 使用信号的设定值在Qt中的表现不符合预期