Python PyQt4 发射和接收自定义信号

1 投票
1 回答
1140 浏览
提问于 2025-04-18 00:08

我知道关于这个话题有很多问题。我看过大部分内容,但还是搞不清楚为什么会遇到这个问题。

简单来说,我想做的是:用一个 QThread 类来显示一个忙碌的进度条(也就是 range (0,0))。

我使用 mysignal = QtCore.pyqtSignal() 来创建一个信号。然后我用 mysignal.emit() 来发送这个信号。这个信号的作用是通知主线程停止进度条的操作。

我把这个信号连接到我的一个函数上,代码是 mysignal.connect(myfunction)。但是每次我运行我的脚本时,都会出现这个错误信息。

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

我这个问题可能是什么原因呢?

顺便说一下:我使用的是 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()

1 个回答

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()

撰写回答