2013-07-30 86 views
0

我嘗試使用SIGNAL從線程接收到主線程的字符串。一切正常,直到我想在QMessageBox中使用字符串。打印出來是沒有問題的,但開始QMessageBox提示給我幾個錯誤(有些是關於QPixmap的,我甚至在GUI中不使用將信號傳遞給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_()) 

我「M得到這個誤差修改:

的QObject ::的setParent:無法設置父,新的父是在不同的線程

的QPixmap:這是不是安全使用外像素圖GUI線程

僅在移動鼠標和QMessageBox提示仍是開此錯誤:

的QObject :: startTimer所:定時器不能從另一個線程開始

的QApplication:對象事件過濾器不能在不同的線程中。

誰能告訴我什麼,我做錯了什麼?

這是我第一次使用線程。

謝謝! Stefanie

回答

4

QtCore.Qt.DirectConnection - 此選項表示插槽將從信號的線程中調用。你的代碼有(至少)兩個線程運行:主GUI線程和DownloadThread。因此,使用此選項,程序將嘗試調用DownloadThread中的threadDone,並嘗試在GUI線程外部創建GUI對象。

這導致:QPixmap: It is not safe to use pixmaps outside the GUI thread

刪除此選項,默認行爲(等待調用插槽之前返回到主線程)應清理錯誤。

+0

非常感謝,這解決了問題! – snowflake