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

StackOverflow https://stackoverflow.com/questions/940555

  •  06-09-2019
  •  | 
  •  

Вопрос

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

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top