繁体   English   中英

PyQt5:查找点击了哪个 QPushButton

[英]PyQt5: Find which QPushButton is clicked

我有多个按钮,想知道点击了哪个按钮。 我发现了错误并且知道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_())

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

class Ui_MainWindow(MainWindow):
   ...

使用 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 中找到相同的内容。

下面的代码运行良好。

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_())

这是一种方法:

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_())

根据@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_())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM