我在另一个线程中访问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)
答案 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的东西来获得最大的性能并触摸计算机中的铁:)