在非GUI线程中不断更新QLabel

发布于 2024-12-23 13:21:31 字数 338 浏览 2 评论 0原文

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

QLabel 中没有显示任何内容。只有例外 QPixmap:在 GUI 线程之外使用像素图是不安全的
有更好或更正确的方法吗?
这是我的另一个线程的 PyQt 代码: self.theQlabel.setPixmap(QtGui.QPixmap.fromImage(myQimg)

I access the Qt GUI's QLabel's QPixmap in another thread since I will finally use this to display mjpeg stream in QLabel, and I decided to use QLabel since its the easiest way
It should look like 'Live' and not block the UI thus using another (non-gui) thread.

nothing shows up in the QLabel. only the exception QPixmap: It is not safe to use pixmaps outside the GUI thread
any better or correct way to do this ?
here is my PyQt code of another thread: self.theQlabel.setPixmap(QtGui.QPixmap.fromImage(myQimg)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

清醇 2024-12-30 13:21:31

不要直接设置像素图,而是让外部线程发出 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);

Instead of directly setting the pixmap, make the external thread emit an updatePixmap signal. Then in the GUI thread, listen to the signal and update the pixamp at that time. Something like that should work (in 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);
追风人 2024-12-30 13:21:31

我认为在 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

似乎也同意我的观点。

I think that it might be dangerous to even create a QPixmap in anything other than the GUI thread. You might want to consider passing a QImage and converting it to a QPixmap in the main thread. I can't find a direct reference to support this assertion, but

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

hints that

All widgets and several related classes, for example QPixmap, don't work in secondary threads.

The email thread at

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

also seems to agree with me.

貪欢 2024-12-30 13:21:31

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

Create RAW DirectX/OpenGL OS context into this QLabel's winId() and do whatever you want. I think, this is the best way for high performance HD video, and the ONLY way :) sometimes you just HAVE to use RAW things to achieve the maximum performance and touch the iron in your computer :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文