如何通过 PySide 上的另一个线程从 QMainWindow 类中捕获信号?

Posted

技术标签:

【中文标题】如何通过 PySide 上的另一个线程从 QMainWindow 类中捕获信号?【英文标题】:How to catch a Signal from QMainWindow class by another thread on PySide? 【发布时间】:2015-07-14 23:16:37 【问题描述】:

我有一个 MainWindow 类,它上面运行着一个 Gui 应用程序,我希望每次从我的应用程序中单击一个按钮时,都会发出一个信号并被另一个线程捕获。有我的示例代码(很抱歉没有发布我的真实代码,但它现在真的很大):

from PySide.QtGui import *
from PySide.QtCore import *
import sys
import mainGui    #Gui file

class MainWindow(QMainWindow, mainGui.Ui_MainWindow):

mySignal = Signal()


    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.newThread = workThread()
        self.newThread.start()

        #myButton is part of Gui application
        self.myButton.clicked.connect(self.myfunction)

    def myfunction(self):
        self.mySignal.emit()

    (...) #Other functions and methods

class workThread(QThread):
     def __init__(self, parent=None):
         super(workThread, self).__init__(parent)

         #The problem:
         MainWindow.mySignal.connect(self.printMessage)

     def run(self):
          (...)

     def printMessage(self):
         print("Signal Recived")
         (...)


def main():
    app = QApplication(sys.argv)
    form = MainWindow()
    form.show()
    app.exec_()

if __name__=="__main__":
    main()

...我收到以下错误: MainWindow.mySignal.connect(self.printMessage) AttributeError: 'PySide.QtCore.Signal' 对象没有属性 'connect'

有什么想法可以解决这个问题吗? 提前致谢!

【问题讨论】:

【参考方案1】:

信号就像方法一样——它们必须绑定到实例。如果您尝试通过类直接访问它们,它们将无法正常工作。

修复该示例的一种方法是将MainWindow 的实例作为线程的父级传递,如下所示:

    self.newThread = workThread(self)
    ...

    parent.mySignal.connect(self.printMessage)

【讨论】:

以上是关于如何通过 PySide 上的另一个线程从 QMainWindow 类中捕获信号?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确退出 Pyside2 多线程 GUI 应用程序?

从qt中的另一个线程运行qtconcurrent时如何关闭程序

如何从我的 XCODE 上的另一个选项卡更改 UILabel 值

PySide2:如何使装饰槽在其工作线程上执行?

如何使用线程自动关闭 PyQt/PySide 窗口?

如何从 Web 应用程序中的另一个线程更新变量?