【问题标题】:Python new style signals and slot between thread and gui app线程和gui应用程序之间的Python新样式信号和槽
【发布时间】:2015-05-06 19:13:06
【问题描述】:

我是 OOP 和 python 的新手。我正在尝试使用新样式的信号和插槽从 Qthread 向 Qt GUI 主窗口发出信号。

这是线程。在单击 GUI 中的 RUN 按钮后,我将在 GUI 中发出更新消息对话框的信号,并在此之后 3 秒。我不确定继承是否定义好,或者信号是否以正确的方式定义。

class OptimThread (QtCore.QThread):

    signalUpdateMessageDialog = QtCore.SIGNAL("updateMessageDialog(PyQt_PyObject,QString)")

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

    def run(self):

        start = time.time()

        self.emit(self.signalUpdateMessageDialog, time.time() - start, 'Initialising...')     

        time.sleep(3)

        self.emit(self.signalUpdateMessageDialog, time.time() - start, 'You waited 3 seconds...')

主类和app部分是这样的(我省略了其他可能不相关的代码)。

class Main(QtGui.QMainWindow, Ui_MainWindow):    

    def __init__(self, parent=None):
        super(Main, self).__init__(parent)

    def updateMessageDialog(self, times, dialog):  

        hours = str(datetime.timedelta(seconds=int(times)))

        self.MessageDialog.insertHtml('<tt>' + hours + ':</tt> ' + dialog + '<br>')

        return
    def clickRun(self):


        self.optimThread = OptimThread()

        self.connect(self.optimThread, QtCore.SIGNAL("updateMessageDialog(PyQt_PyObject,QString)"), self.updateMessageDialog)

        #self.optimThread.signalUpdateMessageDialog.connect(self.updateMessageDialog)

        self.optimThread.start()

if __name__ == '__main__':
    app=QtGui.QApplication(sys.argv)
    window=Main(None)
    app.setActiveWindow(window)
    window.show()
    sys.exit(app.exec_()) # Exit from Python

如果evertyhing 是这样写的,它可以工作。 但是,如果我想在 Main 中使用新样式进行连接:

self.optimThread.signalUpdateMessageDialog.connect(self.updateMessageDialog)

上面写着:

self.optimThread.signalUpdateMessageDialog.connect(self.updateMessageDialog) AttributeError: 'str' 对象没有属性 'connect'

感谢您的建议(与主题和风格相关),并为没有制作 MWE 表示歉意。

【问题讨论】:

    标签: python multithreading pyqt signals-slots


    【解决方案1】:

    您示例的结构或多或少是正确的:但是您将旧式信号槽语法与新式混合在一起。

    信号定义应如下所示:

    class OptimThread(QtCore.QThread):
        signalUpdateMessageDialog = QtCore.pyqtSignal(int, str)
    

    信号应该像这样发出:

        self.signalUpdateMessageDialog.emit(
            time.time() - start, 'Initialising...')
    

    这就是信号的连接方式:

        self.optimThread.signalUpdateMessageDialog.connect(
            self.updateMessageDialog)
    

    使用新式语法,再也不需要使用SIGNAL()SLOT(),也不需要指定C++ 签名。

    更多详情,请参阅PyQt4 reference 中的New-style Signal and Slot Support

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      相关资源
      最近更新 更多