PyQt отправляет параметр в слот при подключении к сигналу
Вопрос
У меня есть меню панели задач, которое при нажатии подключается к слоту, который получает событие триггера.Теперь проблема в том, что я хочу знать, какой пункт меню был нажат, но я не знаю, как отправить эту информацию в подключенную функцию.Вот используется для подключения действия к функции:
QtCore.QObject.connect(menuAction, 'triggered()', menuClickedFunc)
Я знаю, что некоторые события возвращают значение, но Trigged() — нет.Так как мне это сделать?Должен ли я подать свой собственный сигнал?
Решение
Использовать lambda
Вот пример из Книга по PyQt:
self.connect(button3, SIGNAL("clicked()"),
lambda who="Three": self.anyButton(who))
Кстати, вы также можете использовать functools.partial
, но я нахожу lambda
метод проще и понятнее.
Другие советы
Как уже упоминалось здесь вы можете использовать лямбда-функцию для передачи дополнительных аргументов методу, который вы хотите выполнить.
В этом примере вы можете передать строку 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 — использование функции Lambda для передачи дополнительного аргумента в PyQt4
используйте functools.partial
в противном случае вы обнаружите, что не можете передавать аргументы динамически во время работы скрипта, если вы используете лямбда.
В общем, каждый пункт меню должен быть подключен к отдельному слоту, и каждый слот должен выполнять функции только своего собственного пункта меню.Например, если у вас есть такие пункты меню, как «сохранить», «закрыть», «открыть», вам следует создать для каждого отдельный слот, а не пытаться создать один слот с оператором case в нем.
Если вы не хотите делать это таким образом, вы можете использовать QObject::отправитель() функция для получения указателя на отправителя (т.е.:объект, излучающий сигнал).Однако мне хотелось бы услышать немного больше о том, чего вы пытаетесь достичь.
Я также хотел бы добавить, что вы можете использовать sender
метод, если вам просто нужно узнать, какой виджет отправил сигнал.Например:
def menuClickedFunc(self):
# The sender object:
sender = self.sender()
# The sender object's name:
senderName = sender.objectName()
print senderName