【问题标题】:Emit a signal when any button is pressed按下任何按钮时发出信号
【发布时间】:2021-03-24 22:20:33
【问题描述】:

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

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

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

【问题讨论】:

  • “取消切换按钮”是指*特定按钮吗?您能提供minimal, reproducible example吗?考虑寻找QButtonGroup
  • 查看QButtonGroup。我经常使用它。将按钮添加到组有一些开销。如果单击组中的一个按钮,则会发出 buttonClicked 信号。 QButtonGroup 可以在 QtDesigner/Creator 中创建,您可以在 Qt Designer/Creator 中将按钮添加到组中
  • 您真的希望整个应用程序中的any按钮取消切换目标按钮吗?还是您只想将其限制为特定容器/父窗口小部件中的所有按钮?另外,键盘/快捷键激活呢? QButtonGroup 似乎是这里的最佳解决方案,因为它足够灵活,可以处理所有用例。

标签: python pyqt5


【解决方案1】:

如何指出一个可能的解决方案是从按钮继承并实现指示的逻辑,但在 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)

【讨论】:

  • 这个解决方案很有趣,因为它与使用带有默认按钮的 qt 设计器兼容,并且不需要维护按钮组。
【解决方案2】:

您想要的是为现有类型添加功能。这表明您要编写 Button 类的扩展。编写一个继承自Button 的类。编写您自己的函数来处理按钮点击:此函数将调用您的toggle 函数,然后调用父级的按钮点击处理程序。

【讨论】:

  • 以您的想法为基础。创建一个从小部件类继承的类并具有将来自其子小部件(按钮)的每个点击信号连接到其他信号的搜索功能将是一个有效的解决方案?
  • 当然;这应该以同样的方式工作。重要的概念是您正在扩展现有类型——编写一个子类并添加您需要的内容。对于其他一切,请听从父母。
猜你喜欢
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多