Получить valueChanged из qDial для использования в методе для python 3? [Дубликат]

Я написал следующее, поскольку эта проблема не просто специфична для 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

}
4
задан RanRag 18 May 2012 в 14:37
поделиться

3 ответа

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

Я замечаю, что в ваших подключенных функциях 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)

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

10
ответ дан Gary Hughes 19 August 2018 в 19:21
поделиться
  • 1
    Благодарю. Очень приятное объяснение – RanRag 18 May 2012 в 15:01
  • 2
    ok Я понимаю, что когда значение набора изменяется, этот сигнал генерируется с новым значением в качестве аргумента, но как мы можем получить доступ к этому значению непосредственно как переменная value. Я имею в виду, что нам не нужны некоторые специальные вызовы dial. Как мы можем получить доступ к нему только по имени переменной value. – RanRag 18 May 2012 в 15:27
  • 3
    QDial наследуется от QAbstractSlider. В документации вы можете видеть, что valueChanged передает int при испускании и что int является значением ползунка. – Gary Hughes 21 May 2012 в 13:15

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

# 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]]
4
ответ дан alexisdm 19 August 2018 в 19:21
поделиться

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

1
ответ дан RanRag 19 August 2018 в 19:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: