我想从一个单独的线程影响一个QDialog,我必须做两件事:
dialog->show();
dialog->raise();
dialog->activateWindow();
据我了解,这些都是事件,因此必须在主线程事件循环中完成。我想我是通过
QApplication::postEvent
中的QThread::run()
实现的。有人可以确认吗?其次,我想显示在该单独线程中处理过的图像。我想我需要继承我的对话框类并编写一个线程安全的
setImage()
函数,然后由paintEvent()
调用该函数。但是,这似乎是不可能的。我不能用QMutex::unlock()
阻止paintEvent吗?有人可以提供一些建议吗?QApplication::postEvent(dialog, new QShowEvent());
无效。这是从单独的线程调用插槽(作为函数)的解决方案:
QMetaObject::invokeMethod(dialog, "show", Qt::QueuedConnection);
QMetaObject::invokeMethod(dialog, "raise", Qt::QueuedConnection);
...仍在使用
activateWindow()
和QThread
安全功能。因此,对于
QImage
,它是一个QPaintDevice。据说它是线程安全的。我的方法是在线程中设置一个类成员QImage
。然后画。请注意,即使不是更好,下面的方法也是一样。
最佳答案
我认为这是一种更清晰的方法来做您想要的事情:
class Dialog : public QDialog
{
...
public slots:
void showImage(QImage img);
...
}
void Dialog::showImage(QImage img);
{
setImage(img);
show();
raise();
activateWindow();
}
class Thread : public QThread
{
...
signals:
void imageReady(QImage);
}
void Thread::run()
{
QImage img;
/// image processing stuff
emit imageReady(img);
...
}
Thread *thread = new Thread;
Dialog *dialog = new Dialog;
connect(thread, SIGNAL(imageReady(QImage)), dialog, SLOT(showImage(QImage)));
thread->start();
关于c++ - 从QThread影响QDialog,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14843436/