看板 Python 關於我們 聯絡資訊
※ 引述《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