Re: [問題] PyQt: 如何使兩個widget連動?

看板Python作者 (ccc)時間13年前 (2012/04/30 17:02), 編輯推噓1(106)
留言7則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《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

04/30 18:32, , 1F
嗯 ,我後來也想到會有signal循環之類的問題
04/30 18:32, 1F

04/30 18:33, , 2F
不過第一次寫GUI,實在不知道如何解決,非常感謝你
04/30 18:33, 2F

04/30 18:36, , 3F
可以請教一下那個lock要怎麼做嗎?或者有什麼相關的資料?
04/30 18:36, 3F

04/30 18:37, , 4F
謝謝你
04/30 18:37, 4F

04/30 23:10, , 5F
印象中qt會自行判斷 不用特別處理
04/30 23:10, 5F

05/04 19:52, , 6F
Qt 自己會避開 signal recursion, 不用杞人憂天
05/04 19:52, 6F

05/04 19:52, , 7F
C++ Programming in Qt 的一開始就有例子說明這個問題
05/04 19:52, 7F
文章代碼(AID): #1FdbKw_Y (Python)
文章代碼(AID): #1FdbKw_Y (Python)