1

在下面的示例中,我想将信号从 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()
4

1 回答 1

2

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

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

  • 不要b在 A 中创建对象,将bMain 中创建的对象通过构造函数传递给 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
  • 或者不要b在 Main 中创建新对象,并连接b在 A 中创建的对象的信号
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)
于 2019-12-05T16:12:13.040 回答