PyQt отправляет параметр в слот при подключении к сигналу - PullRequest
28 голосов
/ 02 июня 2009

У меня есть меню панели задач, которое при нажатии подключается к слоту, который получает событие триггера. Теперь проблема в том, что я хочу знать, какой пункт меню был нажат, но я не знаю, как отправить эту информацию в подключенную функцию. Вот что используется для подключения действия к функции:

QtCore.QObject.connect(menuAction, 'triggered()', menuClickedFunc)

Я знаю, что некоторые события возвращают значение, но triggered () - нет. Итак, как мне это сделать? Должен ли я сделать свой собственный сигнал?

Ответы [ 5 ]

44 голосов
/ 02 июня 2009

Используйте lambda

Вот пример из PyQt book :

self.connect(button3, SIGNAL("clicked()"),
    lambda who="Three": self.anyButton(who))

Кстати, вы также можете использовать functools.partial, но я считаю, что метод lambda проще и понятнее.

9 голосов
/ 03 ноября 2013

Как уже упоминалось здесь вы можете использовать лямбда-функцию для передачи дополнительных аргументов методу, который вы хотите выполнить.

В этом примере вы можете передать строку obj в функцию AddControl (), вызываемую при нажатии кнопки.

# Create the build button with its caption
self.build_button = QPushButton('&Build Greeting', self)
# Connect the button's clicked signal to AddControl
self.build_button.clicked.connect(lambda: self.AddControl('fooData'))
def AddControl(self, name):
    print name

Источник: snip2code - Использование лямбда-функции для передачи дополнительного аргумента в PyQt4

3 голосов
/ 30 ноября 2015

использовать functools.partial

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

0 голосов
/ 17 апреля 2017

Я также хотел бы добавить, что вы можете использовать метод sender, если вам просто нужно выяснить, какой виджет отправил сигнал. Например:

def menuClickedFunc(self):
    # The sender object:
    sender = self.sender()
    # The sender object's name:
    senderName = sender.objectName()
    print senderName
0 голосов
/ 02 июня 2009

В общем, вы должны иметь каждый пункт меню, подключенный к отдельному слоту, и каждый слот должен обрабатывать функциональность только для своего собственного пункта меню. Например, если у вас есть пункты меню, такие как «сохранить», «закрыть», «открыть», вы должны создать отдельный слот для каждого, а не пытаться использовать один слот с оператором case.

Если вы не хотите делать это таким образом, вы можете использовать функцию QObject :: sender () , чтобы получить указатель на отправителя (то есть: объект, испустивший сигнал). Я хотел бы услышать немного больше о том, чего вы пытаетесь достичь.

...