標籤:

qt窗口之間如何通信或信息共享?

寫一個圖書館管理系統,需要在一個窗口中打開另一個窗口,新窗口中能顯示並修改舊窗口的信息。能不能讓其中的數據指向同一個內存?

看了一些書和博客,有兩種方法

第一種是信號和槽,在新窗口關閉的時候發送信號,舊窗口中的槽接受修改的信息然後再修改。

第二種是自己想的,在新窗口的構造函數中傳遞數據的指針。就像調用函數修改原來函數的數值。

但這兩種都感覺不是很對的感覺,請問該用哪種方法?


準確說,你描述的這兩種方式都不是最好的,你問到的一個問題深入下去其實是一個架構設計的哲學問題,而你的思維停留在來一個需求,然後至上而下的碼磚頭。如此設計隨著軟體規模的膨脹必然變的難以維護,以後要是產品叫你改一個按鈕一個控制項一種展示方式,你恐怕要不勝其煩。

最合理的做法是建模,建立數據模型,datamodel(dm),窗口對應viewmodel(vm),vm∈dm的關係,窗口之間的數據流通不過是多個vm之間的流轉,但是為了解耦你不應該採用vm to vm的方式,任何的數據變化應該直接反應到dm上面,最先由vm修改dm,然後由dm對所有從屬vm進行廣播。這才是合理的架構設計。

有了這個思路,我們才可以進一步探討一下細節,vm究竟如何被dm廣播,其實方法太多太多,比如觀察者設計模式,消息匯流排模式(preactor),PUB/SUB模式(reactor),關鍵看你腦洞大小,而qt中的信號槽本身就實現了類似pub/sub模式,你可以直接使用將vm控制項的setText,setView等等函數跟DM對象的setXXX(setName,setAge,setDist etc.)進行連接應該是最容易實現的方式了。


你只是新窗編輯舊窗的話都用不到信號槽,直接對舊窗的組件聲明為全局、進行編輯就行;或者舊窗組件作為新類構造函數的參數,再進行編輯


https://www.baidu.com/s?wd=qt%20%E7%AA%97%E5%8F%A3%E9%97%B4%E9%80%9A%E4%BF%A1rsv_spt=1rsv_iqid=0xa1f1c713000063edissp=1f=8rsv_bp=0rsv_idx=2ie=utf-8tn=baiduhome_pgrsv_enter=0rsv_sug3=26rsv_sug1=5rsv_t=8696EwGKsd9XeD0tXw3KwTIinG4GBKTcEB4daTKtFQZoDebhu9V6k9scNMGphHNr%2BMQyinputT=10871rsv_sug4=10871

能百度解決的就沒必要來知乎了吧


推薦閱讀:

想學QT,是直接QT5還是先學QT4好?
如何選擇C++與QML交互的兩種方式?
QT溫度計折線圖如何實現?
如何閱讀Telegram(Desktop)的源代碼?
為什麼 Qt 框架不是很流行?

TAG:QtC開發框架 |