2014-03-27 31 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