Я написал следующее, поскольку эта проблема не просто специфична для Integer. Мое заключение состоит в том, что чаще всего, если вы неправильно используете API, вы видите неправильное поведение. Используйте его правильно, и вы должны увидеть правильное поведение:
public static void main (String[] args) {
Byte b1=127;
Byte b2=127;
Short s1=127; //incorrect should use Byte
Short s2=127; //incorrect should use Byte
Short s3=128;
Short s4=128;
Integer i1=127; //incorrect should use Byte
Integer i2=127; //incorrect should use Byte
Integer i3=128;
Integer i4=128;
Integer i5=32767; //incorrect should use Short
Integer i6=32767; //incorrect should use Short
Long l1=127L; //incorrect should use Byte
Long l2=127L; //incorrect should use Byte
Long l3=13267L; //incorrect should use Short
Long l4=32767L; //incorrect should use Short
Long l5=2147483647L; //incorrect should use Integer
Long l6=2147483647L; //incorrect should use Integer
Long l7=2147483648L;
Long l8=2147483648L;
System.out.print(b1==b2); //true (incorrect) Used API correctly
System.out.print(s1==s2); //true (incorrect) Used API incorrectly
System.out.print(i1==i2); //true (incorrect) Used API incorrectly
System.out.print(l1==l2); //true (incorrect) Used API incorrectly
System.out.print(s3==s4); //false (correct) Used API correctly
System.out.print(i3==i4); //false (correct) Used API correctly
System.out.print(i5==i6); //false (correct) Used API correctly
System.out.print(l3==l4); //false (correct) Used API correctly
System.out.print(l7==l8); //false (correct) Used API correctly
System.out.print(l5==l6); //false (correct) Used API incorrectly
}
То, как вы это делаете, прекрасно. Если у вас было немало вещей, вы могли бы подключиться к новой функции, которая обрабатывает все для вас.
Я замечаю, что в ваших подключенных функциях 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
Кроме того, и это зависит от предпочтения, есть новый стиль для сигналов и слотов , которые могут сделать код немного легче читать. Он изменил бы строки
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)
. Но для исходного вопроса и для двух вещей, которые вы делаете, я бы просто подключил сигнал дважды чем иметь вспомогательную функцию.
Вы можете использовать список для подключения двух слотов / функций в одном выражении:
# 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]]
Это подходящий способ, да. Вы can't combine
два оператора CONNECT в одном.
value
. Я имею в виду, что нам не нужны некоторые специальные вызовыdial
. Как мы можем получить доступ к нему только по имени переменнойvalue
. – RanRag 18 May 2012 в 15:27valueChanged
передает int при испускании и что int является значением ползунка. – Gary Hughes 21 May 2012 в 13:15