7

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

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' ?

谢谢!

4

4 回答 4

16

您可以只使用self.sender()来确定发出信号的对象。

在您的代码中,与此类似的东西应该可以工作。

button = QtGui.QPushButton("start go")
button.clicked.connect(self.buttonClick)

def buttonClick(self):
    print self.sender().text()
于 2013-12-02T03:33:13.490 回答
15

这是我为解决问题所做的:

button = QtGui.QPushButton("start go")
button.clicked.connect(lambda: self.buttonClick(button))

def buttonClick(self, button):
    print button.text()
于 2013-12-02T17:20:09.397 回答
1

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

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()来获取对发送信号的对象的引用。但是,这有时被认为是不好的做法,因为它首先破坏了使用信号的主要原因(有关此内容的更多信息,请参见发送者文档中的警告)。

于 2013-12-02T04:51:54.933 回答
0

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

在循环中这样做是行不通的:

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

您的回调将始终使用 button_list 中的最后一个按钮调用(为什么请参阅我刚刚发现的此页面上的信息 - https://blog.mister-muffin.de/2011/08/14/python-for-loop-scope -and-nested-functions )

改为这样做,它可以工作:

for button in button_list :
    button.clicked().connect( lambda b=button: self.buttonClick( b ))
于 2018-03-05T16:51:49.763 回答