2013-07-30 23 views
0

신호를 사용하여 주 GUI에 스레드 문자열을 수신하려고했습니다. QMessageBox에서 문자열을 사용할 때까지 모든 것이 잘 작동합니다. 밖으로 인쇄하는 것은 문제가되지 않습니다하지만 QMessageBox를 시작하면 일부는 심지어 GUI에 사용하지 않는 QPixmap에 대해입니다 (나에게 몇 가지 오류를 제공QMessageBox에 신호를 전달하는 중 PyQT 스레딩 오류가 발생했습니다.

여기 내 코드의 짧은 작업 예입니다.

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

QObject를 :: setParent가 불려 갔을 때 :이하는 오류 받고 있어요 설정할 수 없습니다 부모, 새로운 부모는 다른 스레드에

QPixmap : 외부 픽스맵을 사용하는 것이 안전하지 않습니다 GUI 스레드

마우스를 이동하고 QMessageBox가 열려있는 동안 만이 오류 :

가 에게 는

QObject를이 ::가 startTimer가 : 타이머가 다른 스레드에서 시작할 수 없습니다 것은

의 QApplication : 개체 이벤트 필터가 될 수 없다 다른 스레드에서.

누구든지 내가 뭘 잘못하고 있다고 말할 수 있습니까?

스레드를 처음 사용하는 경우입니다.

감사합니다. 스테파니

답변

4

QtCore.Qt.DirectConnection -이 옵션은 슬롯이 신호의 스레드에서 호출됨을 의미합니다. 귀하의 코드는 실행중인 스레드가 두 개 (기본 GUI 스레드와 DownloadThread) 있습니다. 따라서이 옵션을 사용하면 DownloadThread에서 threadDone을 호출하고 GUI 스레드 외부에서 GUI 개체를 만들려고합니다. QPixmap: It is not safe to use pixmaps outside the GUI thread

오류를 정리해야이 옵션과 기본 동작을 (슬롯을 호출하기 전에 메인 쓰레드로 돌아 기다릴) 제거

이에 연결됩니다.

+0

대단히 고맙습니다. 문제가 해결되었습니다. – snowflake