PyQt передает параметр в слот при подключении к сигналу
У меня есть меню панели задач, которое при щелчке связано с слотом, который получает событие триггера. Теперь проблема в том, что я хочу знать, какой элемент меню был нажат, но я не знаю, как отправить эту информацию в связанную с этим функцию. Здесь используется для подключения действия к функции:
QtCore.QObject.connect(menuAction, 'triggered()', menuClickedFunc)
Я знаю, что некоторые события возвращают значение, но triggered() не делает этого. Итак, как мне это сделать? Должен ли я сделать свой собственный сигнал?
Ответы
Ответ 1
Используйте lambda
Вот пример из PyQt book:
self.connect(button3, SIGNAL("clicked()"),
lambda who="Three": self.anyButton(who))
Кстати, вы также можете использовать functools.partial
, но я нахожу метод lambda
более простым и понятным.
Ответ 2
Как уже упоминалось здесь, вы можете использовать функцию лямбда для передачи дополнительных аргументов методу, который вы хотите выполнить.
В этом примере вы можете передать строку obj функции AddControl(), вызванной при нажатии кнопки.
# Create the build button with its caption
self.build_button = QPushButton('&Build Greeting', self)
# Connect the button clicked signal to AddControl
self.build_button.clicked.connect(lambda: self.AddControl('fooData'))
def AddControl(self, name):
print name
Источник: snip2code - Использование функции Lambda для передачи дополнительных аргументов в PyQt4
Ответ 3
использовать functools.partial
в противном случае вы обнаружите, что динамически не удается передать аргументы при запуске script, если вы используете lambda.
Ответ 4
В общем, вы должны иметь каждый элемент меню, подключенный к другому слоту, и каждый слот обрабатывает функциональные возможности только для своего собственного пункта меню. Например, если у вас есть пункты меню, такие как "сохранить", "закрыть", "открыть", вы должны сделать отдельный слот для каждого, а не пытаться иметь в нем один слот с аргументом case.
Если вы не хотите этого делать, вы можете использовать функцию QObject:: sender(), чтобы получить указатель отправителю (т.е. объекту, который излучал сигнал). Я хотел бы услышать немного больше о том, что вы пытаетесь выполнить.
Ответ 5
Я также хотел бы добавить, что вы можете использовать метод sender
, если вам просто нужно выяснить, какой виджет отправил сигнал. Например:
def menuClickedFunc(self):
# The sender object:
sender = self.sender()
# The sender object name:
senderName = sender.objectName()
print senderName