【问题标题】:PyQt5: How do I "collect" or "receive" an emitted signal?PyQt5:我如何“收集”或“接收”发射的信号?
【发布时间】:2020-12-09 15:32:27
【问题描述】:

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

testSignal = QtCore.pyqtSignal()

pushButton.pressed.connect(buttonPressed)

def buttonPressed(self):
    testSignal.emit()

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

谢谢

【问题讨论】:

  • 您的问题不清楚。首先要在class级别声明一个信号,这样instance的信号才能正确连接。信号的emit() 发出 该信号并调用与其连接的所有插槽/函数,可能带有提供的参数(或没有,如您的情况)。也就是说,不清楚你真正需要/想要做什么:你能更好地解释一下自己吗?
  • 好的,所以当我发出一个信号时,所有连接到该信号的函数都会被调用,对吧?那么如何将函数连接到信号呢?
  • 语法是signal.connect(function)。如果信号在当前类中,则self.testSignal.connect(self.someFunction)
  • 所以在我的例子中应该是testSignal.connect(function) 对吧?因为当我在我的代码中这样做时,我得到:AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'
  • 如前所述,信号必须class ClassName():构造函数缩进级别的级别声明。

标签: python pyqt5 signals-slots


【解决方案1】:

[Py]Qt 信号必须在类级别声明,因为它们只有在创建新类实例时才会“激活”。此外,它们只能用于从 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(),只要鼠标按钮按下按钮就会发出信号,这不被视为标准行为。

【讨论】:

  • 谢谢伙计。你真的帮了我很多。我非常感谢。还要感谢关于clicked()pressed() 的旁注。非常感谢
  • 我还有一个问题,如果您不介意的话。因为我可以用信号发出值,所以我想用信号发出一个滑块值,并在连接到信号的函数中使用它。我该怎么做?
  • 不能直接连接现有滑块的valueChanged 信号吗?
  • 哦,公平点。我可以试试是的。非常感谢你的所有努力
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-24
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
相关资源
最近更新 更多