2014-03-27 30 views
1

我知道有關於這個主題的幾個問題。我仔細看過他們中的大部分,但仍然無法弄清楚爲什麼我有這個問題。Python PyQt4發射和接收自定義信號

基本上,我想要做的是:使用QThread類來顯示繁忙的指示進度條(即range (0,0))。

我使用mysignal = QtCore.pyqtSignal()創建我的信號。之後,我使用mysignal.emit()來傳輸該信號。該信號用於通知主線程停止進度條動作。

這是我該信號連接到我的功能mysignal.connect(myfunction)之一。但是每當我運行我的腳本時,我都有這個錯誤信息。

AttributeError: 'PyQt4.QtCore.pyqtSignal' object has no attribute 'connect' 

什麼可能是我的問題的原因?

FYI:我使用Windows 8.1與Python 2.7.5

編輯:

下面我的代碼

簡化版本:

class Main(QtGui.QMainWindow): 
    ....... 
    ....... 
    self.progressBar = QtGui.QProgressBar(self) 
    self.progressBar.setRange(0,1) 
    button = QtGui.QPushButton('button') 
    button.clicked.connect(self.onStart()) 

    def onStart(self): 
     self.progressBar.setRange(0,0) 
     self.LoadPage = LoadingThread() 
     self.LoadPage.taskFinished.connect(self.onFinished) 
     self.LoadPage.Load() 

    def onFinished(self): 
     self.progressBar.setRange(0,1) 


class LoadingThread(QtCore.QThread): 
    def __init__(self): 
     QtCore.QThread.__init__(self)  
     self.taskFinished = QtCore.pyqtSignal() 
    def Load(self): 
     #My stuffs here (to be executed duing the progress bar busy) 
     time.sleep(5) 
     self.taskFinished.emit() 

回答

2

這聞起來就像是增加了發信號給類實例,而不是類,這是不可能的。這種嘗試自己只是在幾個小時前,得到了同樣的錯誤信息......

確保信號在類中定義:

class Foo(QObject): 

    mysignal = QtCore.pyqtSignal() 

這不起作用:

foo = Foo() 
foo.mysignal = QtCore.pyqtSignal() 

編輯:

在你的情況,改變LoadingThread到:

class LoadingThread(QtCore.QThread): 

    taskFinished = QtCore.pyqtSignal() 

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

    def Load(self): 
     #My stuffs here (to be executed duing the progress bar busy) 
     time.sleep(5) 
     self.taskFinished.emit() 
+0

是它可以調用''我班Main'的setCentralWidget'方法從我的'LoadingThread'類? –

+0

不是。從其他線程與GUI線程進行通信的推薦方式是使用信號和插槽。檢查:http://qt-project.org/doc/qt-4.8/thread-basics.html。如果我的答案解決了您的原始問題,請接受它:) – sebastian