0

我在另一个线程中访问 Qt GUI 的 QLabel 的 QPixmap,因为我最终将使用它在 QLabel 中显示 mjpeg 流,我决定使用 QLabel,因为它是最简单的方法
它应该看起来像“实时”并且不会阻塞 UI,因此使用另一个(非gui)线程。

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

4

3 回答 3

2

不是直接设置像素图,而是让外部线程发出updatePixmap信号。然后在 GUI 线程中,监听信号并在那个时候更新 pixamp。类似的东西应该可以工作(在 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);
于 2012-01-02T14:28:05.257 回答
2

我认为甚至在 GUI 线程以外的任何东西中创建一个都可能是危险的。QPixmap您可能需要考虑在主线程中传递 aQImage并将其转换为 a 。QPixmap我找不到支持这个断言的直接参考,但是

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

暗示

所有小部件和几个相关的类,例如 QPixmap,都不能在辅助线程中工作。

电子邮件线程在

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

似乎也同意我的看法。

于 2012-02-21T08:26:14.307 回答
1

在这个 QLabel 的 winId() 中创建 RAW DirectX/OpenGL OS 上下文,然后做任何你想做的事情。我认为,这是高性能高清视频的最佳方式,也是唯一的方式 :) 有时你只需要使用 RAW 的东西来获得最大的性能并触摸你的电脑中的铁 :)

于 2013-07-29T15:56:07.560 回答