как передать аргументы в функцию, используя предопределенный SIGNAL в PyQT - PullRequest
0 голосов
/ 19 марта 2011

предположим, у вас есть 3 экземпляра QRadioButtons внутри класса

self.Option1 = QRadioButton()
self.Option2 = QRadioButton()
self.Option2 = QRadioButton()

(для краткости я не написал весь скрипт), и вы хотите использовать их для выполнения определенной функции, когда пользователь щелкает еетак что вы делаете

self.connect(self.Option1,SIGNAL("clicked()"), self.myFunction)
self.connect(self.Option2,SIGNAL("clicked()"), self.myFunction)
self.connect(self.Option2,SIGNAL("clicked()"), self.myFunction)

Как передать аргументы в myFunction, чтобы она знала, какой из QRadioButtons был нажат пользователем?так что я могу делать такие вещи, как

def myFunction(choice):
   if choice == Option1:
       do something
   if choice == Option2:
       do something

Сейчас у меня есть 3 функции, каждая для каждого подключения, как это

self.connect(self.Option1,SIGNAL("clicked()"), self.myFunction1)
self.connect(self.Option2,SIGNAL("clicked()"), self.myFunction2)
self.connect(self.Option2,SIGNAL("clicked()"), self.myFunction2)

И этот подход работает просто отлично, но вы можете увидеть, насколько быстрокод может расти, потому что с каждым добавляемым виджетом мне нужно будет написать хотя бы одну новую функцию или изменить существующие, это будет кошмаром сопровождения (не говоря уже о том, что он выглядит некрасиво и предотвращает повторное использование кода).

Быстрый визит в Google дал мне это:

    self.label = QLabel(" ")

    self.connect(self, SIGNAL("didSomething"),
                 self.update_label)
    self.do_something()

def do_something(self):
    self.emit(SIGNAL("didSomething"), "important", "information")

def update_label(self, value1, value2):
    self.label.setText(value1 + " " + value2)

(опять же, я не включил весь сценарий, но вы можете проверить его здесь ) То, что он сделал, былосоздание метода для определения пользовательского эмиттера, который отправляет аргументы при отправке, а затем активирует его вручную, используя

self.do_something()

Так что, естественно, функция connect выбирает это излучение и передает аргументы функции update_label, частично достигая того, что яхотеть сделать.Но он делает это вручную, есть ли способ автоматически «перехватывать» стандартные сигналы (например, сигнал clicked (), который излучает QRadioButtons) и добавлять к нему аргументы, чтобы они передавались в функцию для работы с ними?

Заранее спасибо

1 Ответ

2 голосов
/ 19 марта 2011

Я думаю, что Qt-решение этой проблемы - QSignalMapper. Но у меня была такая же проблема раньше, и я понял, что с помощью «частичной» функции проще Используйте это так:

from functools import partial

self.connect(self.Option1,SIGNAL("clicked()"), partial(self.myFunction, 1))
self.connect(self.Option2,SIGNAL("clicked()"), partial(self.myFunction, 2))
self.connect(self.Option3,SIGNAL("clicked()"), partial(self.myFunction, 3))

Для получения дополнительной информации: http://docs.python.org/library/functools.html#functools.partial

...