繁体   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