我是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' ?
谢谢!
答案 0 :(得分:11)
以下是我为解决问题所做的工作:
button = QtGui.QPushButton("start go")
button.clicked.connect(lambda: self.buttonClick(button))
def buttonClick(self, button):
print button.text()
答案 1 :(得分:10)
您可以使用self.sender()
来确定发起信号的对象。
在你的代码中,有些内容应该可行。
button = QtGui.QPushButton("start go")
button.clicked.connect(self.buttonClick)
def buttonClick(self):
print self.sender().text()
答案 2 :(得分: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()
来获取对发送信号的对象的引用。但是,这有时被认为是不好的做法,因为它破坏了首先使用信号的主要原因(有关详细信息,请参阅docs for sender中的警告)。
答案 3 :(得分: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 ))