我想从一个单独的线程影响一个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/

10-12 20:40