2013-05-02 46 views
0

假设我有两个QspinBoxes,并且如果我更新spinBox_1,第二个将显示两倍这个值。如果我更新spinBox_2,第一个将显示这个值的一半。使用两种方法,如on_valueChanged1on_valueChanged2以及与SIGNAL("valueChanged(int)")的相互连接在这里可以正常工作。更改1调用方法更改2,然后更改并再次调用1。幸运的是,事情在这里停止,因为因子2和1/2的选择结束了,所以第二个值实际上不会改变。如果选择其他值,则会导致几乎无限的呼叫和召回。Pythonic的方式来避免相互连接的QObject中的无限循环

Pythonic将如何解决这个问题。请问我和connectdisconnect再次发生变化,还是有一个解决方案太明显,我看到?

更新 A和hasFocus()剪断工作的例子看起来像:

QMainWindow.connect(self.ui.doubleSpinBox,SIGNAL("valueChanged(double)"),self.on_change1) 
QMainWindow.connect(self.ui.doubleSpinBox_2,SIGNAL("valueChanged(double)"),self.on_change2) 

def on_change1(self): 
    if self.ui.doubleSpinBox.hasFocus(): 
     self.ui.doubleSpinBox_2.setValue(3.3*self.ui.doubleSpinBox.value()) 

def on_change2(self): 
    if self.ui.doubleSpinBox_2.hasFocus(): 
     self.ui.doubleSpinBox.setValue(self.ui.doubleSpinBox_2.value()*.77) 

因此,从一个事实,即它是工作分开,这是最好的/最通用的解决方案?

回答

0

难道你不能分裂on_valueChanged只检测手动(而不是信号)的对象的变化?

这样,如果你改变spinBox_1,它的on_valueChanged1回调信号spinBox_2改变,但不会触发on_valueChanged2,避免无限循环。

+0

有趣的一点。你能做到吗?你会怎么做?我会用'hasFocus()'吗?另外'setUpdatesEnabled()'可能是一个选项。 – mikuszefski 2013-05-02 08:18:54

+1

'hasFocus()'可能是一个安全的选择,因为只有用户调整的字段才有焦点。 'setUpdatesEnabled()'只影响绘图和更新,所以它可能不会阻止被调用的回调。 – Meoiswa 2013-05-02 08:30:45

+0

这是我的印象看着类的参考“短时间禁用更新,例如为了避免屏幕闪烁”;所以'hasFocus()'会产生一个额外的if语句。 – mikuszefski 2013-05-02 08:37:59