关于qt:PySide:如何在QPushButton单击插槽中获取单击的QPushButton对象?

PySide : How to get the clicked QPushButton object in the QPushButton clicked slot?

我是PySide的新手。我想在其单击的插槽中获取QPushButton obj(例如使用它来获取其文本)。

1
2
3
4
5
6
button = QtGui.QPushButton("start go")
button.clicked.connect(self.buttonClick)

def buttonClick(self):
    ... # How can I get the button  object?
    # print button.text()  how to get the text : 'start go' ?

谢谢!


这是我要解决的问题:

1
2
3
4
5
button = QtGui.QPushButton("start go")
button.clicked.connect(lambda: self.buttonClick(button))

def buttonClick(self, button):
    print button.text()


您可以仅使用self.sender()确定引发信号的对象。

在您的代码中,应该可以执行类似的工作。

1
2
3
4
5
button = QtGui.QPushButton("start go")
button.clicked.connect(self.buttonClick)

def buttonClick(self):
    print self.sender().text()


通常,大多数窗口小部件都将在主窗口的设置代码中创建。始终将这些小部件添加为主窗口的属性是一个好主意,以便以后可以轻松访问它们:

1
2
3
4
5
6
7
8
9
10
class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None)
        super(MainWindow, self).__init__(parent)
        ...
        self.button = QtGui.QPushButton("start go")
        self.button.clicked.connect(self.buttonClick)
        ...

    def buttonClick(self):
        print(self.button.text())

如果您有许多都使用相同处理程序的按钮,则可以将按钮添加到QButtonGroup,并将处理程序连接到其buttonClicked信号。该信号可以发送被单击的按钮,也可以发送您自己指定的标识符。

也有可能使用self.sender()来获取对发送信号的对象的引用。但是,有时这被认为是一种不好的做法,因为它破坏了首先使用信号的主要原因(有关更多信息,请参见文档中的发件人警告)。


我实际上想对答案#1中的评论发表评论,但还没有足够的声誉:)。评论是"虽然在循环中连接许多按钮时使用这样的lambda可能会很棘手"。这正是我找到此页面时需要做的。

循环执行此操作不起作用:

1
2
for button in button_list :
    button.clicked().connect( lambda: self.buttonClick( button )

您的回调将始终通过button_list中的最后一个按钮来调用(因此,为什么我也刚刚找到此页面上的信息,为什么-https://blog.mister-muffin.de/2011/08/14/python-for-循环作用域和嵌套功能)

相反,它可以工作:

1
2
for button in button_list :
    button.clicked().connect( lambda b=button: self.buttonClick( b ))