python - 按下任何按钮时发出信号
问题描述
在 pyqt5 应用程序中,我想在单击任何其他按钮时取消切换按钮。
单击布局或小部件中的任何按钮时是否可以发出信号?
我可以将每个按钮单击连接到取消切换功能,但如果按钮发生变化,这将很难维护。有没有一种简洁的方法来实现相同的功能而不必一个一个地连接按钮?
解决方案
如何指出可能的解决方案是从按钮继承并实现指示的逻辑,但在 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)
推荐阅读
- minecraft - Minecraft 中 vannila 命令块的 If 语句
- django - 如何将 Django 的翻译字符串与 Wagtailtrans 一起使用(支持多语言 Wagtail 站点的附加组件)
- list - Kotlin 二维数组赋值
- c# - 如何在 Linq FromSQL 查询中使用参数
- angular - 在 angular6 中测试 ViewContainerRef
- python - 未获取数据 Web.DataReader Panda
- python - 在python中解析CSV的特定列
- php - 在 Netbeans 10.0 中禁用多色大括号
- email - 如何欺骗发件人的电子邮件地址?
- php - 根据 Session 的用户 ID 向数据库中插入一个值