【问题标题】:Python PyQt4 Emitting and Receiving Custom signalsPython PyQt4 发出和接收自定义信号
【发布时间】:2014-03-27 12:38:35
【问题描述】:

我知道有几个关于这个主题的问题。我已经浏览了其中的大多数,但仍然无法弄清楚我为什么会遇到这个问题。

基本上,我想做的是:使用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()

【问题讨论】:

    标签: python python-2.7 signals pyqt4 signals-slots


    【解决方案1】:

    这听起来像是您将信号添加到类实例而不是类,这是不可能的。几个小时前我自己试过这个,得到同样的错误信息......

    确保在类上定义了信号:

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

    【讨论】:

    • 是否可以从我的LoadingThread 类中调用我的Main 类的setCentralWidget 方法?
    • 不。从其他线程与 GUI 线程通信的推荐方法是使用信号和插槽。检查:qt-project.org/doc/qt-4.8/thread-basics.html。如果我的回答解决了你原来的问题,请接受:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 2023-03-17
    • 1970-01-01
    • 2012-01-11
    相关资源
    最近更新 更多