有什么方法可以将不同的点击处理程序绑定到 PyQt5 中的 QPushButton?

Is there any way to bind a differnt click handler to QPushButton in PyQt5?

我有一个 QPushbutton:

btn = QPushButton("Click me")
btn.clicked.connect(lambda: print("one"))

稍后在我的程序中,我想重新绑定它的点击处理程序,我试图通过再次调用 connect 来实现:

btn.clicked.connect(lambda: print("two"))

我希望看到控制台只打印 two,但实际上它同时打印了 onetwo。换句话说,我实际上将两个点击处理程序绑定到按钮。

如何重新绑定点击处理程序?

Qt 中的信号和槽是观察者模式(pub-sub)实现,许多对象可以订阅同一个信号并订阅多次。他们可以使用 disconnect 功能取消订阅。

from PyQt5 import QtWidgets, QtCore

if __name__ == "__main__":
    app = QtWidgets.QApplication([])

    def handler1():
        print("one")

    def handler2():
        print("two")

    button = QtWidgets.QPushButton("test")
    button.clicked.connect(handler1)
    button.show()

    def change_handler():
        print("change_handler")
        button.clicked.disconnect(handler1)
        button.clicked.connect(handler2)

    QtCore.QTimer.singleShot(2000, change_handler)

    app.exec()

在 lambda 的情况下,您只能使用 disconnect()(不带参数)一次断开所有订阅者,这适用于按钮情况。