如何在不同类别中使用插槽+信号?

2024-04-19 22:48:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须说这是一个非常初级的问题。我读了很多书,也尝试了很多,但仍然不明白Slot+Signal是如何工作的

在下面的代码中,我想在单击按钮时将三个变量从MyApp类转移到Worker类

代码不起作用

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys


class Worker(QObject):
    def __init__(self, parent=None):
        super(Worker, self).__init__(parent)

    @pyqtSlot(str, str, int)
    def onJob(self, strA, strB, int1):
        print(strA, strB, int1)
        for i in range(40):
            print(i)


class MyApp(QWidget):
    def __init__(self, parent= None):
        super(MyApp, self).__init__(parent)
        self.initUI()

    def initUI(self):
        self.btn = QPushButton("start", self)
        self.btn.clicked.connect(self.start)
        self.show()

    def start(self):
        otherClass = Worker()
        self.signal = pyqtSignal(str, str, int)
        self.signal.emit("foo", "baz", 10)
        self.signal.connect(otherClass.onJob)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyApp()
    window.show()
    sys.exit(app.exec_())

Tags: 代码fromimportselfsignalinitdefsys
1条回答
网友
1楼 · 发布于 2024-04-19 22:48:27

您的代码有以下错误:

  • 信号不得在类的任何方法中声明,它必须与方法处于同一级别

  • 如果我在连接到任何插槽之前发送一个信号,那么没有人会听信息,因此数据将丢失,也就是说,数据传输几乎是瞬时的

在以下代码中,我实现了必要的修改以使其正常工作:

class MyApp(QWidget):
    signal = pyqtSignal(str, str, int)
    def __init__(self, parent= None):
        super(MyApp, self).__init__(parent)
        self.initUI()

    def initUI(self):
        self.btn = QPushButton("start", self)
        self.btn.clicked.connect(self.start)
        self.show()

    def start(self):
        otherClass = Worker()
        self.signal.connect(otherClass.onJob)
        self.signal.emit("foo", "baz", 10)

相关问题 更多 >