2012-05-18 6 views
4

Я пытаюсь изучить PyQt от rapid gui programming with python and qt и в настоящее время учится Signals и Slots.PyQt подключить СИГНАЛ к нескольким SLOT

Ниже приведен краткий фрагмент моего кода:

self.connect(self.dial, SIGNAL("valueChanged(int)"),self.spinbox.setValue) #1 
self.connect(self.dial, SIGNAL("valueChanged(int)"),self.getValue_dial) #2 
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),self.dial.setValue) 
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),self.getValue_spinbox) 

def getValue_dial(self): 
     print self.dial.value() 

def getValue_spinbox(self): 
     print self.dial.value() 

То, что я пытаюсь достичь здесь называют 2 Слоты сразу, что это spinbox.setValue и getValue_dial для dial объекта, как только ValueChanged(int) сигнал.

Приведенный выше код успешно выполняется без ошибок, а print - соответствующие значения при их изменении.

Теперь мой вопрос в том, как это сделать, чтобы назвать несколько слотов для одного сигнала.?

Может ли вышеуказанные два утверждения (1 & 2) быть объединены в один оператор.

Вот ссылка для моего complete code.

ответ

9

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

Я заметил, что в ваших подключенных функциях getValue вы получаете значение прямо от объекта; знаете ли вы, что значение передается как параметр с сигналом valueChanged(int)? Если вы измените свои функции getValue, чтобы принять дополнительный параметр, вам не нужно будет получать значение непосредственно из объекта. Конечно, вы можете полностью устранить функцию getValue и выпустить инструкцию печати в вспомогательной функции.

self.connect(self.dial, SIGNAL("valueChanged(int)"), self.dial_value_changed) 
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),self.spinbox_value_changed) 

def dial_value_changed(self, value): 
    self.spinbox.setValue(value) 
    self.getValue_dial(value) 

def spinbox_value_changed(self, value): 
    self.dial.setValue(value) 
    self.getValue_spinbox(value) 

def getValue_dial(self, value): 
     print value 

def getValue_spinbox(self, value): 
     print value 

Кроме того, и это вниз к предпочтению, есть new style for signals and slots, который может сделать код немного легче читать. Это приведет к изменению линии

self.connect(self.dial, SIGNAL("valueChanged(int)"), self.dial_value_changed) 
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),self.spinbox_value_changed) 

выше

self.dial.valueChanged.connect(self.dial_value_changed) 
self.spinbox.valueChanged.connect(self.spinbox_value_changed) 

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

+0

Спасибо. Очень приятное объяснение – RanRag

+0

ok Я понимаю, что когда значение набора изменяется, этот сигнал выдается с новым значением в качестве аргумента, но как мы можем получить доступ к этому значению непосредственно как переменную 'значение'. Я имею в виду, нам не нужны некоторые специальные вызовы для набора номера. Как мы можем получить доступ к нему только по имени переменной 'значение'. – RanRag

+0

QDial наследует от QAbstractSlider. В [документации] (http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qabstractslider.html#valueChanged) вы можете видеть, что 'valueChanged' передает int при испускании и что int является значение ползунка. –

1

Это подходящий способ, да. Вы делаете два оператора CONNECT в одном.

3

Вы можете использовать список, чтобы соединить два слота/функции в одном операторе:

# in Python 2.X 
map(self.dial.valueChanged.connect, [self.spinbox.setValue, self.getValue_dial]) 

# in Python 3.X (map returns an iterator instead of processing the list) 
list(map(self.dial.valueChanged.connect, [self.spinbox.setValue, self.getValue_dial])) 

# or with any Python version 
[self.dial.valueChanged.connect(x) for x in [self.spinbox.setValue, self.getValue_dial]] 
Смежные вопросы