Re: [問題] 非兄弟物件之間要怎麼溝通?

看板C_and_CPP (C/C++)作者 (里巷人)時間2年前 (2022/07/14 04:37), 編輯推噓1(100)
留言1則, 1人參與, 2年前最新討論串3/3 (看更多)
Qt 已經很久沒摸了 但看到你最後一段寫 「有許多外部UI需要更新」 感覺就只是利用UI framework的event system可解決 所有的UI framework都會設計event system 用來處理UI update/render/key inputs等等 Qt太久沒用但我覺得一定有啦 命名不外乎eventXXX之類的吧 而且理論上會嵌在UI最基礎的元件之內 貫穿整個視窗系統的設計 然後可能還得提供filter之類的功能 免得message過多每個元件都狂反應 而且這類設計通常還有一套遍歷子元件的邏輯 當你新增UI元件的時候 其實framework老早就把它們串在一起 還規定了他們響應event的流程跟邏輯 如果你還需要自訂事件 系統也會有一套自訂事件的現成設計 但是imgui那類的framework可能例外 這類小框架可能比較傾向于改變state去重畫外觀 你最好把Qt好好耐心看一遍教學 基本上這類framework一通百通 幾乎都大同小異 即使忘了你也可以猜到怎麼做 你用sigslot的方式硬幹去更新UI 就表示應該沒仔細去讀過文件教學 不然就是你把業務邏輯散到各UI去了 表示在設計上也是有點問題 建議你把業務和資料放到最上層app裡面 (額外封裝成control也行) 提供許多業務slot讓元件去connect 每個元件新增都知道自己需要連結什麼slot 而UI處理的部分就完全走系統那一套 這樣需要更新UI的slot function 只要把訊息send or paot到app的msg queeu app就會在適當的時候自動派發訊息 給所有掛在他底下的UI物件 處理訊息的邏輯你可以放在UI小物件裡 (高概率是什麼xxxEventHandler) 這樣的好處是什麼? 通常app都是global instance 你可以在任何地方取得app 當然就可以取得業務slot和control 每個自訂的UI元件可以暴露signal 當在生成所有UI物件的時候 就可以connect(在UI construtor內或app內) 也可以在slot裡動態的connect/disconnect 因為slot可以完全知道是誰呼叫的 (有可能需要dynamic cast or object id) 透過sigslot你就把UI串接業務搞定 而業務統一在control or app層處理 處理之後透個系統event system 通知UI遍歷傳遞訊息 UI再由event handler處理update/render/redraw 至於編譯速度的問題 由於改動slot內部的程式碼 只會讓app底下業務的部分重新編譯 但是由於slot/signal沒有改變 不會重新編譯相關的物件 也不會重新編譯event system的部分 ※ 引述《liu2007 (薯)》之銘言: : 我的開發平台是 win7 : 工具是QT Creator : 版本是Qt Core 5.15.2 : 有個問題困擾我很久,不知道該怎麼寫才好 : 故來請教比較好的寫法是什麼 : 在開始問問題之前想要說明的是 : 下面我會用到阿公、父親、兒子的說法其實不是很準確 : 只是單純我自己用來說明什麼class 包含 什麼 class的用詞 : 如果造成混淆請見諒。 : 例如 class Father裡面有一個class Child 的 property : 而 class GramPa 裡面有一個 class Father 的 property : 以下自行理解的解決方法是素人方法 : 太菜還請見諒 : 如果兩個Child物件要溝通沒有問題 : 把一方的signal和slot給connect()起來就好 : 這也是最基礎的寫法。 : 只要知道兩個Child的pointer就好。 : 如果是祖孫溝通 : 對於 Father 來說 : 就必須要有 GramPa 和 Child的pointer才能進行connect : 對 Father 來說,Child 是自己製造或是本來自己的 property所以沒問題 : GramPa 的話 : 1.除非本來就有寫一個 getParent()來認親,要不然 : 2.只能一開始在生成 Father的時候在建構子裡面塞 GramPa 的pointer : 3.或者是如果 GramPa 偉大到整個program只會有一個 GramPa 的話 : 也可以用 singleton來取得 GramPa 的pointer : 但如果祖孫的距離不只一層呢? : 如果是上述的方法1或方法2 : 會變成每一層都多一個parent pointer 的 field : 每一層的建構子都要都要多塞一個parent的pointer,在new 的時候也要把this丟進去 : 然後每一層的slot都只幹一件事情,就是emit signal給上層 : 這樣一來寫了一堆很重複很累贅的程式碼只為了傳遞一個訊號 : 取名也很頭痛,通常會取很相近的名字, : 如果這之中有bug出現,還要定睛去看到底是哪一層傳錯,很累。 : 似乎只能用上述的方法3 singleton,也就變成必須要include GramPa.h : 程式多多少少搞得臃腫,如果GramPa.h有改的話還拖累編譯的速度 : 我不知道我問的是否清楚(因為我要上班了,有點慌亂在亂打文章) : 我的程式有很多那種某個小功能按鈕按下去之後要叫很外面的UI做動作的地方 : 想知道該怎麼做比較好 : 感謝閱讀 ----- Sent from MeowPtt on my iPhone -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.166.249.176 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1657744649.A.10B.html

07/16 09:55, 2年前 , 1F
說得很好,推~
07/16 09:55, 1F
文章代碼(AID): #1Ypoq94B (C_and_CPP)
文章代碼(AID): #1Ypoq94B (C_and_CPP)