【问题标题】:pyqt5 show which button was clickedpyqt5 显示点击了哪个按钮
【发布时间】:2017-08-04 01:32:04
【问题描述】:

我是 PyQT5 的新手,我希望有几个按钮,并让最后一个按钮处于“选中”状态。当单击另一个按钮时,前一个按钮会“未选中”,而单击的按钮会“选中”。

import sys
from PyQt5.QtWidgets import *

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(30, 30, 400, 200)
        self.initUI()

    def initUI(self):
        self.button1 = QPushButton(self)
        self.button1.setGeometry(40, 40, 100, 50)
        self.button1.setText("Button 1")

        self.button2 = QPushButton(self)
        self.button2.setGeometry(150, 40, 100, 50)
        self.button2.setText("Button 2")

        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

【问题讨论】:

    标签: python pyqt pyqt5 qbuttongroup


    【解决方案1】:

    基于您的代码,您可以将button1button2 添加到QButtonGroup,并将exclusive 属性设置为True

    class Example(QWidget):
        def __init__(self):
            super().__init__()
            self.setGeometry(30, 30, 400, 200)
            self.initUI()
    
        def initUI(self):
            self.button1 = QPushButton(self)
            self.button1.setGeometry(40, 40, 100, 50)
            self.button1.setText("Button 1")
    
            self.button2 = QPushButton(self)
            self.button2.setGeometry(150, 40, 100, 50)
            self.button2.setText("Button 2")
    
            self.btn_grp = QButtonGroup()
            self.btn_grp.setExclusive(True)
            self.btn_grp.addButton(self.button1)
            self.btn_grp.addButton(self.button2)
    
            self.btn_grp.buttonClicked.connect(self.on_click)
    
            self.show()
    
        def on_click(self, btn):
            pass # do something with the button clicked
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ex = Example()
        sys.exit(app.exec_())
    

    在这里,我还将一个空槽连接到信号QButtonGroup.buttonClicked,每当单击组中的按钮时都会发出该信号。

    要找出哪个按钮是当前选中的按钮,您可以调用方法QButtonGroup.checkedButton()QButtonGroup.checkedId()。前者将返回一个QButton 对象,后者将返回一个索引int,对应于按钮添加到组中的顺序。

    【讨论】:

    • 如何从“on_click”方法内部调用“QButtonGroup.checkedButton()”?您正在通过 QPushButton,因此您可以要求 btn.text() 但如何从按钮本身检查组?
    • 好答案。值得一提的是,根据文档,setExclusive 属性默认为 True
    【解决方案2】:

    您可以使用 functools partial 或 sender 方法来检查按下了哪个按钮:

    import sys
    from PyQt5.QtWidgets import *
    from functools import partial
    class Example(QWidget):
        def __init__(self):
            super().__init__()
            self.setGeometry(30, 30, 400, 200)
            self.initUI()
    
        def initUI(self):
            self.button1 = QPushButton(self)
            self.button1.setGeometry(40, 40, 100, 50)
            self.button1.setText("Button 1")
            self.button1.clicked.connect(partial(self.clicked_btn, 'Button 1'))
    
            self.button2 = QPushButton(self)
            self.button2.setGeometry(150, 40, 100, 50)
            self.button2.setText("Button 2")
            self.button2.clicked.connect(partial(self.clicked_btn, 'Button 2'))
    
            self.show()
    
        def clicked_btn(self, value):
            print(f'{value} clicked')
            sender = self.sender()
            print(f'Sender says: {sender.text()} was clicked')
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ex = Example()
        sys.exit(app.exec_())
    

    【讨论】:

    • 这也是一个了不起的解决方案。人们需要对此投票!
    【解决方案3】:
    1. 通过 setCheckable(True) 使按钮可检查
    2. 将按钮添加到 QButtonGroup() 中,其余按钮会自动排序:

      class Example(QWidget):
         def __init__(self):
             super().__init__()
             self.setGeometry(30, 30, 400, 200)
             self.initUI()
      
         def initUI(self):
             self.button1 = QPushButton(self)
             self.button1.setGeometry(40, 40, 100, 50)
             self.button1.setText("Button 1")
             self.button1.setCheckable(True)
             self.button2 = QPushButton(self)
             self.button2.setGeometry(150, 40, 100, 50)
             self.button2.setText("Button 2")
             self.button2.setCheckable(True)
      
             self.my_button_group = QButtonGroup()
             self.my_button_group.addButton(self.button1)
             self.my_button_group.addButton(self.button2)
      
             self.show()
      

    【讨论】:

    • 其实你是正确的设置按钮被点击时被检查将用于了解用户当前按下了哪个按钮。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2022-08-18
    • 2011-11-22
    • 2016-09-16
    相关资源
    最近更新 更多