PySide:как получить нажатый объект QPushButton в слоте щелчка QPushButton?

Я новичок в 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 ответов


вот что я сделал, чтобы решить проблему:

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

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

Вы можете просто использовать self.sender() определить объект, который инициировал сигнал.

в вашем коде что-то вроде этого должно работать.

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

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

обычно большинство виджетов создается в коде установки главного окна. Это хорошая идея, чтобы всегда добавлять эти виджеты как атрибуты главного окна, так что они могут быть легко доступны позже:

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, но у меня пока недостаточно репутации :). Комментарий: "может быть сложно использовать лямбду, как это, при подключении множества кнопок в цикле.- Именно это мне и нужно было сделать, когда я нашел эту страницу.

делаю это в цикле не работает:

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

ваш обратного вызова всегда будет с последней кнопки в источник внешней аутентификации. (почему см. информацию на этой странице Я тоже нашла - 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 ))