постоянное обновление QLabel в потоке без GUI - PullRequest
0 голосов
/ 02 января 2012

Я получаю доступ к QPixmap QLabel в Qt GUI в другом потоке , так как я, наконец, буду использовать его для отображения потока mjpeg в QLabel, и я решил использовать QLabel, поскольку это самый простой способ
Это должно выглядеть«Живи» и не блокируй пользовательский интерфейс, используя другой (не GUI) поток.

в QLabel ничего не отображается.только исключение QPixmap: It is not safe to use pixmaps outside the GUI thread
какой-нибудь лучший или правильный способ сделать это?
вот мой код PyQt другого потока: self.theQlabel.setPixmap(QtGui.QPixmap.fromImage(myQimg)

Ответы [ 3 ]

2 голосов
/ 21 февраля 2012

Я думаю, что даже создавать a QPixmap в чем-либо кроме потока GUI может быть опасно.Возможно, вы захотите передать 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 голосов
/ 02 января 2012

Вместо прямой настройки растрового изображения, заставьте внешний поток излучать сигнал 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);
1 голос
/ 29 июля 2013

Создайте контекст RAW DirectX / OpenGL OS в winId () этого QLabel и делайте все, что вы хотите. Я думаю, это лучший способ для высокопроизводительного HD-видео, и ЕДИНСТВЕННЫЙ способ :) иногда вам просто нужно использовать RAW-вещи для достижения максимальной производительности и прикоснуться к железу в вашем компьютере:)

...