作者cccx (ccc)
看板Python
标题Re: [问题] PyQt: 如何使两个widget连动?
时间Mon Apr 30 17:02:48 2012
※ 引述《Landau (赖宏道)》之铭言:
: 我使用QDoubleSpinBox和QSlider
: 希望使QDoubleSpinBox的值(小数)和QSlider的位置比例一致
: 我使用valueChanged事件,当值改变时就改变某个data member,
: 然後根据这个data member去设定这两个widget的值,
: 可是发生了很奇怪的事,
: 似乎无法设置到某个值,在我这里是29跟57,58(或者说,到了28跟56就上不去了)
: 希望高手给点意见,关於这个问题或如何绕过这个问题,
: 谢谢。
: 这是程式码
: http://codepad.org/c5QuIj64
建议不要让两个 widget 直接连动
中间加个 lock 挡住
你目前的连动会形成 signal 循环 (如下图)
valueChanged
spinbox ----------------> changeNum_spinbox(v)
^ /
\----------\ /----------/ setValue
\ /
X
/ \
/----------/ \----------\ setValue
v \
slider -----------------> changeNum_slider(v)
valueChanged
可以改成
valueChanged
spinbox ----------------> changeNum_spinbox(v)
|
lock ?
-------------------------/ \----> ignore
/ off on
\
--> lock on --> setValue --> lock off
/
\ off on
-------------------------\ /----> ignore
lock ?
|
slider -----------------> changeNum_slider(v)
valueChanged
上面是简单的例子
要再深入可以朝 model-view-controller 之类的设计模式去实作
======================= 废话分隔线 =======================
原po程式最简单的修正方式
就是加入四舍五入的运算 --> round
把原来的 int(self.num*100)
改成 int(round(self.num*100))
就大功告成了~
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.195.34.149
1F:→ Landau:嗯 ,我後来也想到会有signal循环之类的问题 04/30 18:32
2F:→ Landau:不过第一次写GUI,实在不知道如何解决,非常感谢你 04/30 18:33
3F:推 Landau:可以请教一下那个lock要怎麽做吗?或者有什麽相关的资料? 04/30 18:36
4F:→ Landau:谢谢你 04/30 18:37
5F:→ KSJ:印象中qt会自行判断 不用特别处理 04/30 23:10
6F:→ uranusjr:Qt 自己会避开 signal recursion, 不用杞人忧天 05/04 19:52
7F:→ uranusjr:C++ Programming in Qt 的一开始就有例子说明这个问题 05/04 19:52