繁体   English   中英

PyQt5:我如何“收集”或“接收”发射的信号?

[英]PyQt5: How do I “collect” or “receive” an emitted signal?

在我的代码中,我在 2 个单独的文件中有 2 个类。 我有一个信号testSignal ,一个按钮pushButton ,我像这样连接按钮:

testSignal = QtCore.pyqtSignal()

pushButton.pressed.connect(buttonPressed)

def buttonPressed(self):
    testSignal.emit()

现在我想要做的是“接收”类/文件中发出的信号,但我对 emit() 的实际工作原理有些不知所措。 有没有人有任何关于 emit() function 指南的链接或者可以以某种方式提供帮助?

谢谢

[Py]Qt 信号必须在 class 级别声明,因为它们只有在创建新的 class 实例时才会“激活”。 此外,它们只能用于从 QObject 继承的类(包括 QWidget 子类),并且将它们与标准 python object类一起使用将不起作用

class SomeWindow(QtWidgets.QWidget):
    testSignal = QtCore.pyqtSignal()
    def __init__(self):
        super().__init__()
        # ...
        pushButton.pressed.connect(self.buttonPressed)
        # connect the custom signal with an *instance method*
        self.testSignal.connect(self.someInstanceFunction)

    def buttonPressed(self):
        # emit the signal
        self.testSignal.emit()

    def someInstanceFunction(self):
        print('hello from the instance!')


def someAnonymousFunction():
    print('hello from outside!')


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = SomeWindow()
    # connect the signal with an anonymous function
    window.testSignal.connect(someAnonymousFunction)
    sys.exit(app.exec_())

显然,上面的示例没有多大意义,因为自定义信号通常用于在(可能不同的)类的实例之间进行通信,但这仅用于解释目的。 此外,您可以“连接”信号(只要它们的签名兼容):

class SomeWindow(QtWidgets.QWidget):
    testSignal = QtCore.pyqtSignal()
    def __init__(self):
        super().__init__()
        # ...
        # emit the testSignal when the button emits its pressed signal
        pushButton.pressed.connect(self.testSignal)
        self.testSignal.connect(self.someInstanceFunction)

    # ...

请注意,如果您想在用户单击按钮时执行某些操作,则应该使用clicked() ,而不是pressed() ,并且区别非常重要:通常的约定是,仅当用户按下按钮时才认为按钮被单击并且在按钮区域内释放鼠标按钮,这样可以避免在按钮区域释放鼠标按钮时“点击”。 如果您连接到pressed() ,只要鼠标按钮按下按钮,就会发出信号,这不被认为是标准行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM