0

我想从一个单独的线程影响一个 QDialog,我必须做两件事:

dialog->show();
dialog->raise();
dialog->activateWindow();

据我了解,这些是事件,因此必须在主线程事件循环中完成。我想我QApplication::postEventQThread::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是在线程中设置一个类成员。后来画了。

请注意,以下方法同样好,即使不是更好。

4

1 回答 1

4

我认为这是一种更清晰的方式来做你想做的事:

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();
于 2013-02-13T06:32:13.910 回答