我想从一个单独的线程影响一个 QDialog,我必须做两件事:
dialog->show();
dialog->raise();
dialog->activateWindow();
据我了解,这些是事件,因此必须在主线程事件循环中完成。我想我QApplication::postEvent
在QThread::run()
. 有人可以确认吗?
其次,我想显示在该单独线程中处理的图像。我想我需要子类化我的对话框类并编写一个线程安全setImage()
函数,然后由paintEvent()
......调用它但是,这似乎是不可能的。我不能用QMutex::unlock()
? 有人可以提供一些建议吗?
QApplication::postEvent(dialog, new QShowEvent());
不工作。
这是从单独的线程调用插槽(作为函数)的解决方案:
QMetaObject::invokeMethod(dialog, "show", Qt::QueuedConnection);
QMetaObject::invokeMethod(dialog, "raise", Qt::QueuedConnection);
...仍在工作activateWindow()
和QThread
安全的功能。
所以对于QImage
,它是一个 QPaintDevice。据说它是线程安全的。我的方法QImage
是在线程中设置一个类成员。后来画了。
请注意,以下方法同样好,即使不是更好。