Подтвердить что ты не робот

PyQt передает параметр в слот при подключении к сигналу

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

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

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

4b9b3361

Ответ 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