在Qt Widgets中分离应用程序逻辑和视图

时间:2015-01-26 15:29:36

标签: c++ qt qwidget

我想知道:'官员'编写Qt Widgets应用程序时的编码风格。我特别指的是将逻辑和视图代码分开。

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

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

但这是在你的MainWindow中放入大量其他逻辑的开始。如果您想将该应用程序转换为QML,则会出现问题。如果你创建了一个控制器类,然后实例化Window或widget,或者接受控制器作为构造函数参数,这样你就可以用视图和插槽连接视图和控制器,你就可以用其他东西替换视图了,但保留逻辑。对我来说似乎更好,但似乎并不常见。

对于逻辑使用窗口小部件/窗口类(从QMainWindowQWidget派生)仍然被认为是不好的做法,即使你到处都看到了吗?

1 个答案:

答案 0 :(得分:1)

我认为将所有代码放在一个类或一个甚至一个模块中并不是一个好主意。更换零件时会遇到很多困难,因为当应用程序随着时间的推移变大时,一个零件会发生变化。

我个人使用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可以是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