【问题标题】:Problem with PyQt5 signals emitted from other classes从其他类发出的 PyQt5 信号有问题
【发布时间】:2019-12-05 16:01:32
【问题描述】:

在下面的示例中,我想将信号从 A 发送到 Main,从 B 发送到 Main。接收到来自 A 的信号是可以的,但是 B 不工作。棘手的部分是 B 中的“计算”必须从 A 触发,而不是从 Main 触发。将不胜感激。

主要:

import sys

from PyQt5.QtCore import pyqtSlot, QObject
from PyQt5.QtWidgets import QApplication

from A import A
from B import B


class Main(QObject):
    def __init__(self):
        super(Main, self).__init__()
        self.a = A()
        self.b = B()
        self.a.msg.connect(self.show_message)
        self.b.msg.connect(self.show_message)

    @pyqtSlot(str)
    def show_message(self, text):
        print(text)

    def start(self):
        self.a.dojob()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    m = Main()
    m.start()
    sys.exit(app.exec_())

A 类:

from PyQt5.QtCore import pyqtSignal, QObject
from B import B


class A(QObject):
    msg = pyqtSignal(str)

    def __init__(self):
        super(A, self).__init__()
        self.b = B()

    def send_message(self):
        self.msg.emit("from A")

    def dojob(self):
        self.send_message()
        self.b.dojobB()

B 类:

from PyQt5.QtCore import pyqtSignal, QObject


class B(QObject):
    msg = pyqtSignal(str)

    def __init__(self):
        super(B, self).__init__()

    def send_message(self):
        self.msg.emit("from B")

    def dojobB(self):
        self.send_message()

【问题讨论】:

    标签: python pyqt pyqt5 qt-signals qt-slot


    【解决方案1】:

    问题是您认为在 Main 中创建的对象 b 与在 A 中创建的对象 b 相同,但这是错误的,它们是 2 个不同的对象(您可以在每个对象中执行 print(self.b)你会看到你得到了不同的id)。

    所以有两种可能的解决方案:

    • 不要在A中创建对象b,通过构造函数将Main中创建的对象b传递给A类:
    class Main(QObject):
        def __init__(self):
            super(Main, self).__init__()
            self.b = B()
            self.a = A(self.b)
            self.a.msg.connect(self.show_message)
            self.b.msg.connect(self.show_message)
    class A(QObject):
        msg = pyqtSignal(str)
    
        def __init__(self, b):
            super(A, self).__init__()
            self.b = b
    • 或者不要在Main中新建对象b,连接A中创建的对象b的信号
    class Main(QObject):
        def __init__(self):
            super(Main, self).__init__()
            self.a = A()
            self.a.msg.connect(self.show_message)
            self.a.b.msg.connect(self.show_message)

    【讨论】:

    • 谢谢!我知道这与它们是不同的对象有关,但不知道如何解决。我将坚持第二种解决方案。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 2018-05-14
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    相关资源
    最近更新 更多