- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 QT 中创建一个客户端应用程序,它需要处理线程和可变数量的窗口实例。但是我很难弄清楚如何在其中一个处理线程中创建一个新窗口。我知道所有 ui 元素都必须在与 QApplication 类相同的线程中创建,但我需要能够实例化,或者至少在另一个线程中有对 QDialog 的引用。
线程和 QDialog 之间的通信可以使用信号来完成,我不担心这一点,但实际上创建窗口是另一回事。我可以使用信号告诉主线程为窗口创建一个实例,然后以某种方式检索指向它的指针,但对我来说这似乎有点复杂和丑陋。有没有更好的方法来完成这样的任务?在主线程之外创建 QDialog 是否存在 QApplication 类?
编辑 :我尝试过 Q_INVOKABLE 方法,但它不能跨线程工作。我创建了一个 View 工厂类,它可以创建一个我指定的类型的 QDialog 并返回一个指向它的指针。此类已在主 GUI 线程中实例化,并且将对此类的引用发送到任何工作线程。问题是,当线程使用 Qt::BlockingQueuedConnection 从工厂调用 create 方法时,调用方法失败。如果我将其更改为 Qt::DirectConnection,则 invoke 方法调用正确的 create 方法,但在当前线程中作为工作线程。
我的主要功能如下所示:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ViewFactory vFactory;
vFactory.registerCreator(Util::W_CONNECT, new ConnectWindow::ConnectCreator());
ClientApp app;
if(!app.Initialize(&vFactory))
return 0;
app.start();
a.exec();
.............................
}
void ClientApp::run()
{
QDialog * tmp = NULL;
QMetaObject::invokeMethod(this->_vFactory, "create", Qt::BlockingQueuedConnection,
Q_RETURN_ARG(QDialog*, tmp), Q_ARG(int, 0));
}
最佳答案
你只能在 gui 线程中做 Gui 的东西。显而易见的解决方案是工作线程向 gui 线程发送消息 = Qt 术语中的信号。
如果工作线程需要提出问题,它应该向 gui 线程发送一条消息,然后阻塞直到它收到信号。
关于qt - 在主线程外创建 QDialog 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5128541/
我是一名优秀的程序员,十分优秀!