【问题标题】:PyQt5: Find which QPushButton is clickedPyQt5:查找点击了哪个 QPushButton
【发布时间】:2018-04-23 17:57:45
【问题描述】:

我有多个按钮,想知道点击了哪个按钮。我发现了错误并且知道sender() 函数必须与QWidget 而不是类对象一起使用,但我无法找出解决方案。

from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):

    def setupUi(self, MainWindow):
        """Widget code here"""
        self.btn1 = QtWidgets.QPushButton(self.widget)
        """Button properties here"""
        self.btn1.setObjectName("btn1")
        self.btn1.clicked.connect(self.btnListener)

        self.btn2 = QtWidgets.QPushButton(self.widget)
        self.btn2.setObjectName("btn2")
        self.btn2.clicked.connect(self.btnListener)

        """..... more buttons"""

    def btnListener(self):
        sender_button = self.sender() # Error Ui_MainWindow has no attribute sender
        print(sender_button)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

【问题讨论】:

  • 尝试搜索绑定和事件

标签: python pyqt5 qpushbutton


【解决方案1】:

在 Qt 4.8 和 python2.7 中,我使用 partial 将多个参数传递给信号。

from functools import partial
...

def initGui(self):
    ...
    self.btn1.clicked.connect(partial(self.btnListener, "btn1"))
    self.btn2.clicked.connect(partial(self.btnListener, "btn2"))
    ...

def btnListener(self, button_name):
    print('button_name {}'.format(button_name))
    ...

通过这个方法,你可以知道点击了哪个按钮。

我希望能帮助你在 QT5 中找到相同的东西。

【讨论】:

    【解决方案2】:

    您需要从 MainWindow 继承 Ui_MainWindow 才能使其工作。

    class Ui_MainWindow(MainWindow):
       ...
    

    【讨论】:

      【解决方案3】:

      下面的代码运行良好。

      import sys
      from PyQt5.QtWidgets import *
      from PyQt5.QtGui import *
      from PyQt5.QtCore import *
      
      class DlgMain(QWidget):
          def __init__(self):
              super().__init__()
              self.setWindowTitle("Yeh lay")
              self.resize(400,400)
      
              self.btn1 = QPushButton("btn1", self)
              self.btn1.move(200,200)
              self.btn1.clicked.connect(self.btnListener)
      
              self.btn2 = QPushButton("btn2", self)
              self.btn2.move(200,230)
              self.btn2.clicked.connect(self.btnListener)
      
          def btnListener(self):
              rbt = self.sender()
              print(rbt.text())
      
      
      if __name__ =='__main__':
          app = QApplication(sys.argv)
          dlgMain = DlgMain()
          dlgMain.show()
          sys.exit(app.exec_())
      

      【讨论】:

        【解决方案4】:

        有一个办法:

        from PyQt5 import QtCore, QtGui, QtWidgets
        class Ui_MainWindow(QtWidgets.QMainWindow):
            def __init__(self):
                super(Ui_MainWindow, self).__init__()
                self.setupUI()
        
            def setupUi(self, MainWindow):
                self.MainWindow = MainWindow
                """Widget code here"""
                self.btn1 = QtWidgets.QPushButton(self.widget)
                """Button properties here"""
                self.btn1.setObjectName("btn1")
                self.btn1.clicked.connect(self.btnListener)
        
                self.btn2 = QtWidgets.QPushButton(self.widget)
                self.btn2.setObjectName("btn2")
                self.btn2.clicked.connect(self.btnListener)
        
                """..... more buttons"""
        
            def btnListener(self):
                sender_button = self..sender()
                print(sender_button.text())
        
        if __name__ == "__main__":
            import sys
            app = QtWidgets.QApplication(sys.argv)
            MainWindow = QtWidgets.QMainWindow()
            ui = Ui_MainWindow()
            ui.setupUi(MainWindow)
            MainWindow.show()
            sys.exit(app.exec_())
        

        【讨论】:

          【解决方案5】:

          根据@MrLeeh 的建议完成此操作,并且成功了

          from PyQt5 import QtCore, QtGui, QtWidgets
          class Ui_MainWindow(object):
          
          def setupUi(self, MainWindow):
              self.MainWindow = MainWindow
              """Widget code here"""
              self.btn1 = QtWidgets.QPushButton(self.widget)
              """Button properties here"""
              self.btn1.setObjectName("btn1")
              self.btn1.clicked.connect(self.btnListener)
          
              self.btn2 = QtWidgets.QPushButton(self.widget)
              self.btn2.setObjectName("btn2")
              self.btn2.clicked.connect(self.btnListener)
          
              """..... more buttons"""
          
          def btnListener(self):
              sender_button = self.MainWindow.sender()
              print(sender_button.text())
          
          if __name__ == "__main__":
              import sys
              app = QtWidgets.QApplication(sys.argv)
              MainWindow = QtWidgets.QMainWindow()
              ui = Ui_MainWindow()
              ui.setupUi(MainWindow)
              MainWindow.show()
              sys.exit(app.exec_())
          

          【讨论】:

          • 如果有人给出的答案对您有帮助,您应该点赞和/或接受。
          • @ekhumoro 我从那个建议中得到了一个想法,而我没有使用那个建议......没有任何投票的意义
          猜你喜欢
          • 2017-08-04
          • 2014-11-17
          • 2020-11-03
          • 2012-11-13
          • 2012-04-17
          • 2022-01-05
          • 2018-04-25
          • 2011-11-22
          • 2011-12-23
          相关资源
          最近更新 更多