不断更新非GUI线程中的QLabel

时间:2012-01-02 14:04:42

标签: multithreading qt pyqt qlabel

我在另一个线程中访问Qt GUI的QLabel的QPixmap,因为我最终会使用它在QLabel中显示mjpeg流,我决定使用QLabel,因为它是最简单的方式
它应该看起来像'Live'而不是阻止UI因此使用另一个(非gui)线程。

QLabel中没有任何内容。只有例外QPixmap: It is not safe to use pixmaps outside the GUI thread
任何更好或更正确的方法吗?
这是另一个线程的PyQt代码:self.theQlabel.setPixmap(QtGui.QPixmap.fromImage(myQimg)

3 个答案:

答案 0 :(得分:2)

不是直接设置像素图,而是让外部线程发出updatePixmap信号。然后在GUI线程中,监听信号并在那时更新像素。这样的东西应该有用(用C ++编写):

// In the GUI thread:

class YourWidget: QObject {

public:

    YourWidget();

public slots:

    void updatePixmap(const QPixmap& pixmap);

}

YourWidget::YourWidget() {
    // Connect to the signal here:
    QObject::connect(otherThread, SIGNAL(updatePixmap(const QPixmap&)), this, SLOT(updatePixmap(const QPixmap&)));
}

YourWidget::void updatePixmap(const QPixmap& pixmap) {
    // Update the pixmap here in a thread-safe way
}


// In the external thread:

// Emit the signal. The GUI thread will receive it and can then update the pixmap
emit updatePixmap(thePixmap);

答案 1 :(得分:2)

我认为,除了GUI线程之外,甚至创建一个QPixmap也许是危险的。您可能需要考虑传递QImage并将其转换为主线程中的QPixmap。我找不到支持这个断言的直接引用,但是

http://developer.qt.nokia.com/doc/qt-4.8/thread-basics.html

提示

  

所有小部件和几个相关的类(例如QPixmap)在辅助线程中不起作用。

的电子邮件主题

http://lists.trolltech.com/qt-interest/2008-11/msg00534.html

似乎也同意我的看法。

答案 2 :(得分:1)

在此QLabel的winId()中创建RAW DirectX / OpenGL操作系统上下文并执行您想要的任何操作。我认为,这是高性能高清视频的最佳方式,也是唯一的方式:)有时你只需要使用RAW的东西来获得最大的性能并触摸计算机中的铁:)