簡體   English   中英

在Qt Widgets中分離應用程序邏輯和視圖

[英]Separating application logic and view in Qt Widgets

我想知道:編寫Qt Widgets應用程序時的“官方”編碼風格是什么。 我特指的是將邏輯和視圖代碼分開。

默認的Qt Designer方式使得將所有內容都放在一個類中非常誘人。 實際上,有很多代碼示例表明你可以將MainWindow.cpp視為“在這里拋出所有全局變量”類。

舉個簡單的例子,您的應用程序可能需要QNetworkAccessManager 您可以將其存儲在MainWindow ,然后將其傳遞給您打開的任何窗口。

但這是在MainWindow中放入大量其他邏輯的開始。 如果您想將該應用程序轉換為QML,則會出現問題。 如果你創建了一個控制器類,然后實例化Window或widget,或者接受控制器作為構造函數參數,這樣你就可以用視圖和插槽連接視圖和控制器,你就可以用其他東西替換視圖了,但保留邏輯。 對我來說似乎更好,但似乎不是常態。

是否仍然認為使用窗口小部件/窗口類(從QMainWindowQWidget派生)用於邏輯是不好的做法,即使你到處都看到它?

我認為將所有代碼只放在一個類或一個甚至一個模塊中並不是一個好主意。 更換零件會遇到很多困難,因為當您的應用程序隨着時間的推移變大時,會更換一個零件。

我個人使用Subdirs來分離我的代碼部分(邏輯,GUI)。 使用Subdirs是將代碼模塊彼此分開的好主意。 這樣,您就可以擁有可重復使用且可以輕松更改的獨立軟件模塊。 它還使項目更清晰,更易於閱讀。

在這種方法中,模塊可以通過信號和槽相互作用,這使得不同的部件完全獨立,並且改變一個模塊不需要改變其他部件。

Qt Creator提供良好的自動化,使部件彼此喜歡。 您可以創建Subdirs項目並將子項目添加到其.pro文件中:

TEMPLATE = subdirs

CONFIG += ordered

SUBDIRS += \
    Component1 \
    Component2 \
    Component3 \
    MainApp \

您應該首先在列表中引入其他人所依賴的子項目。 另請注意,子項目的.pro文件的名稱應與其文件夾名稱相同。 這樣可以檢測子項目並在“項目”窗格中列出。

子項目Component1Component2Component3可以是庫。 Component1的.pro文件的一部分:

TARGET = Component1
TEMPLATE = lib

DEFINES += COMPONENT1_LIBRARY

SOURCES += ...
HEADERS += ...

子項目MainApp可以是應用程序。 MainApp的.pro文件的MainApp

TARGET = MainApp
TEMPLATE = app

您可以通過將每個子項目鏈接到子項目來使用它們。 這可以通過右鍵單擊子項目並選擇“ Add Library然后選擇“ Internal Library 從子項目列表中選擇一個庫時,鏈接配置會自動添加到.pro中。 它會像:

win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../Component1/release/ -lComponent1
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../Component1/debug/ -lComponent1
else:unix: LIBS += -L$$OUT_PWD/../Component1/ -lComponent1

INCLUDEPATH += $$PWD/../Component1
DEPENDPATH += $$PWD/../Component1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM