作者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
→ Landau:嗯 ,我後來也想到會有signal循環之類的問題 04/30 18:32
→ Landau:不過第一次寫GUI,實在不知道如何解決,非常感謝你 04/30 18:33
推 Landau:可以請教一下那個lock要怎麼做嗎?或者有什麼相關的資料? 04/30 18:36
→ Landau:謝謝你 04/30 18:37
→ KSJ:印象中qt會自行判斷 不用特別處理 04/30 23:10
→ uranusjr:Qt 自己會避開 signal recursion, 不用杞人憂天 05/04 19:52
→ uranusjr:C++ Programming in Qt 的一開始就有例子說明這個問題 05/04 19:52