首页 > 解决方案 > 按下任何按钮时发出信号

问题描述

在 pyqt5 应用程序中,我想在单击任何其他按钮时取消切换按钮。

单击布局或小部件中的任何按钮时是否可以发出信号?

我可以将每个按钮单击连接到取消切换功能,但如果按钮发生变化,这将很难维护。有没有一种简洁的方法来实现相同的功能而不必一个一个地连接按钮?

标签: pythonpyqt5

解决方案


如何指出可能的解决方案是从按钮继承并实现指示的逻辑,但在 Qt 的情况下,可以利用单击信号与按下按钮时的 QEvent.MouseButtonRelease 事件相关联的事实. 考虑到上述情况,可以使用 notify 来实现逻辑:

import sys

from PyQt5.QtCore import pyqtSignal, QCoreApplication, QEvent
from PyQt5.QtWidgets import (
    QAbstractButton,
    QApplication,
    QPushButton,
    QVBoxLayout,
    QWidget,
)


class Application(QApplication):
    buttonClicked = pyqtSignal(QAbstractButton)

    def notify(self, receiver, event):
        if (
            isinstance(receiver, QAbstractButton)
            and receiver.isEnabled()
            and event.type() == QEvent.MouseButtonRelease
        ):
            self.buttonClicked.emit(receiver)
        return super().notify(receiver, event)


def main(argv):
    app = Application(argv)

    view = QWidget()
    lay = QVBoxLayout(view)

    special_button = QPushButton("Special")
    lay.addWidget(special_button)

    for i in range(10):
        button = QPushButton(f"button{i}")
        lay.addWidget(button)

    view.show()

    def handle_clicked(button):
        if button is not special_button:
            print(f"{button} clicked")

    QCoreApplication.instance().buttonClicked.connect(handle_clicked)

    sys.exit(app.exec_())


if __name__ == "__main__":
    main(sys.argv)

推荐阅读