2013-07-30 2 views
0

Я попытался получить строку из потока в мой основной графический интерфейс с использованием СИГНАЛОВ. Все работает нормально, пока я не хочу использовать строку в QMessageBox. Распечатка не проблема, но начиная QMessageBox дает мне несколько ошибок (некоторые из них о QPixmap, которые я даже не использовать в GUIОшибка потоковой передачи PyQT при передаче сигнала на QMessageBox

Вот короткий рабочий пример моего кода:.

import sys 
import urllib2 
import time 
from PyQt4 import QtCore, QtGui 


class DownloadThread(QtCore.QThread): 
    def __init__(self): 
     QtCore.QThread.__init__(self) 


    def run(self): 
     time.sleep(3) 
     self.emit(QtCore.SIGNAL("threadDone(QString)"), 'test') 


class MainWindow(QtGui.QWidget): 
    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.list_widget = QtGui.QListWidget() 
     self.button = QtGui.QPushButton("Start") 
     self.button.clicked.connect(self.start_download) 
     layout = QtGui.QVBoxLayout() 
     layout.addWidget(self.button) 
     layout.addWidget(self.list_widget) 
     self.setLayout(layout) 

     self.downloader = DownloadThread() 
     self.connect(self.downloader, QtCore.SIGNAL("threadDone(QString)"), self.threadDone, QtCore.Qt.DirectConnection) 

    def start_download(self): 
     self.downloader.start() 

    def threadDone(self, info_message): 
     print info_message 
     QtGui.QMessageBox.information(self, 
        u"Information", 
        info_message 
        ) 
     #self.show_info_message(info_message) 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    window = MainWindow() 
    window.resize(640, 480) 
    window.show() 
    sys.exit(app.exec_()) 

I «получаю это erros:

QObject :: SetParent: не удается установить родителя, новый родитель находится в другом потоке

QPixmap: это не безопасно использовать растров за пределами GUI поток

Эта ошибка возникает только при перемещении мыши и QMessageBox остается открытым:

QObject :: StartTimer: таймеры не может быть запущен из другого потока

QApplication: Фильтр событий объекта не может быть в другой теме.

Может ли кто-нибудь сказать мне, что я делаю неправильно?

Это первый раз, когда я использую темы.

Спасибо! Stefanie

ответ

4

QtCore.Qt.DirectConnection - этот параметр означает, что слот будет вызываться из потока сигнала. В вашем коде есть (по крайней мере) два потока: основной поток графического интерфейса и DownloadThread. Таким образом, с помощью этой опции программа пытается вызвать threadDone с DownloadThread и пытается создать объект GUI за пределами потока графического интерфейса.

Это приводит к: QPixmap: It is not safe to use pixmaps outside the GUI thread

Удалить этот параметр и поведение по умолчанию (ждать, чтобы вернуться к основному потоку перед вызовом слота) следует очистить ошибку.

+0

Большое спасибо, это решило проблему! – snowflake

Смежные вопросы