c++ - 在 Qt Widgets 中分离应用程序逻辑和 View

标签 c++ qt qwidget

我想知道:在编写 Qt Widgets 应用程序时,什么是“官方”编码风格。我特别指的是将逻辑和 View 代码分开。

默认的 Qt Designer 方式使得将所有内容都放在一个类中非常诱人。事实上,有很多代码示例表明您可以将 MainWindow.cpp 视为“将所有全局变量都放在此处”类。

作为一个简单的例子,您的应用程序可能需要一个QNetworkAccessManager。您可以将其存储在 MainWindow 中,然后将其传递给您打开的任何窗口。

但这只是将大量其他逻辑放入您的 MainWindow 的开始。如果您随后想将该应用程序转换为 QML,就会遇到问题。如果您创建了一个 Controller 类,该类依次实例化窗口或小部件,或者接受 Controller 作为构造函数参数,以便您可以将 View 和 Controller 与信号和槽连接起来,您就可以用其他东西替换 View ,但保留逻辑。对我来说似乎好多了,但似乎不是常态。

是否仍然认为将小部件/窗口类(派生自 QMainWindowQWidget)用于逻辑是不好的做法,即使它随处可见?

最佳答案

我认为将所有代码放在一个类甚至一个模块中并不是一个好主意。当你的应用程序随着时间的推移变得越来越大时,你会遇到很多更改部件的困难,因为一个部件是专门更改的。

我个人使用 Subdirs 来分隔我的部分代码(逻辑、GUI)。使用 Subdirs 是将代码模块彼此分开的好主意。这样您就可以拥有独立的软件模块,这些模块可以重复使用并且可以轻松更改。它还使项目更清晰、更易于阅读。

在这种方法中,模块可以通过信号和槽相互交互,这使得不同的组件完全独立,并且更改一个模块不需要更改其他部分。

Qt Creator 提供了良好的自动化功能,可以让各个部分相互喜欢。你可以创建一个 Subdirs 项目并将你的子项目添加到它的 .pro 文件中:

TEMPLATE = subdirs

CONFIG += ordered

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

你应该把其他人依赖的子项目放在列表的第一位。另请注意,子项目的 .pro 文件的名称应与其文件夹名称相同。这样子项目就会被检测到并列在“项目” Pane 中。

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

TARGET = Component1
TEMPLATE = lib

DEFINES += COMPONENT1_LIBRARY

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

子项目MainApp可以是app。 MainApp 的 .pro 文件的一部分:

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

关于c++ - 在 Qt Widgets 中分离应用程序逻辑和 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28153245/

相关文章:

c++ - C++中的Socket connect()函数解释/Reference operator and Pointers

c++ - 错误 : QueryFrame not a member of cv

c++ - 寻找更好的数据排序方法

类函数中的c++ char数组输出

使用样式表时的 QTabWidget tabPosition

qt - 连接到QNetworkReply::错误信号

qt4 - 如何强制 QWidget 显示在单独的窗口中?

Qt:捕获和传递信号的最佳机制

c++ - 为什么 QGraphicsWidget 的选择边框在 QGraphicsScene 中不可见?

c++ - 静态数据成员真的可以进行惰性初始化吗?