LCs*_*Csa 15 c++ user-interface qt conceptual separation-of-concerns
我完成了一个项目C++.它是一个使用CodeBlocks创建的控制台应用程序.虽然我认为在这个问题的范围内并不是那么重要:应用程序管理有关小公司的账单和客户的数据.该程序已经完成,可以通过控制台用户界面轻松扩展(现在,我以程序员的身份运行它).
现在我决定学习使用GUI编程Qt和QtCreator及其QtDesigner!
不仅因为在创建GUI应用程序时将逻辑与GUI分离是一种常见做法,我想将我的项目分为两个重要部分,即逻辑和GUI.你已经知道逻辑部分是完整的; 我所拥有的是一个名为project包含另一个文件夹(CodeBlocks项目)的项目文件夹project_logic,它再次包含几个类,因此头文件和实现文件(以及一个主,当然最终会过时).它还包含程序读/写的文件.这是写在"纯" C++,并使用没有提供的手段Qt,这是对我很重要,它保持这种方式!
现在我在-folder中添加了一个Qt项目project_gui,project并开始创建GUI,只实现最基本的功能,比如在对话框之间切换,关闭应用程序等等.到目前为止,它对未来的后端()一无所知project_logic.
作为第三个组件,我需要某种控制,它将应用程序的逻辑与GUI相关联.这是我的概念性问题:在一个应用程序中将它们组合在一起的最佳方法是什么?
由于project_logic可以单独作为控制台应用程序工作,因此它已经提供了最重要的控制组件和功能.这将保持这种方式,因为我想保持其独立功能.更是如此,因为我对GUI编程完全不熟悉和/或在两周内我可能碰巧为同一逻辑创建另一个GUI.结果是逻辑部分的类像任何其他头一样包含在GUI源中,并用于创建具有完整功能的程序.验证用户输入将停留在GUI部分上.在任何情况下,程序的逻辑都是可更新的.
使GUI尽可能重用; 我应该实现第三个组件project_controlling,它提供GUI和逻辑之间的交互(通过控制完成的用户输入验证),因为两者中的每一个都尽可能独立吗?GUI不包括逻辑标题,可以这么说,但包括控制标题?
我承认,第二点可能听起来有点奇怪; 简而言之,我的目标是:
project_logic标准C++和独立(在修补,添加功能等方面......)和Qt最大限度地利用GUI(同时合理地)分离GUI和逻辑.我应该project_logic通过#include "../project_logic/header1.h"等包括标题吗?(使用这些类可能有问题,我将在另一个问题中发布.)
我应该将它们作为子项目包括在内吗?
我如何"在代码中"连接部件?
逻辑函数是否仍然找到我之前提到的文件(读/写)?
请记住以下几点:我是GUI编程的新手!我尽我所能来解释我的想法/问题...但是,我知道C和C++并编写控制台应用程序,我用它来进行大学的模拟,并且可以很好地处理标准的东西,我想.即使潜在的回答者想要提出一种非常不同的方法,我也会感谢我提出的概念的"解决方案".我在引言中解释了这个原因.不必提及虽然我当然有兴趣听取不同的建议.
在我做了一些研究之后,我决定发布这个问题,并且之前尝试过"试错"时尚.在StackOverflow和其他主板上有很多关于这个主题的信息,所以我想提出我的想法并收集批评和输入,而不是添加另一个"如何?" 大杂烩的问题.
由于这个问题是关于一般的方法,我可能(非常肯定...... :-P)稍后会提出更多的技术问题,我想在出现这个问题时立即编辑这个问题(超链接).但是,当然,如果有的话,这个问题的基本配方是受欢迎的.
经过一些评论和回答后,我想发布一些编辑只是为了清楚地说明:
project_logic 或多或少地在CodeBlocks中完成并编码为CodeBlocks项目.main.cpp现在只用于调试.)project_gui 正被设置为Qt-Widget-Application项目(使用QtCreator/Designer).project_logic).... 工作流程,我想跟随,因为这是我的第一个大项目:
project_logic并且project_gui不会离开各自的目录; 它们都在一个名为的目录中project.(例外:如有必要,逻辑将作为dll(或类似的东西)导出,然后提供给GUI.)project_logic在CodeBlocks中我想要改变的东西(并重复可能的导出,如上所述).project_logic(或者像任何第三层一样project_controlling)必须以project_gui可以想象的最简单的方式制成一次性的......(参见第1号思路):-P当您在不同项目中开发应用程序的不同部分时,最简单的方法是将主项目与库链接并使用它们。因此,在您的情况下,您应该为您的 Qt 项目提供在 CodeBlocks 中开发和编译的项目逻辑的 dll,链接到它并使用类。
例如,您可以将库的头文件放在名为的文件夹中,Logic并将文件的调试和发布版本.lib放在相关文件夹中,然后链接您的应用程序:
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/Logic/release/ -lLogic
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/Logic/debug/ -lLogic
INCLUDEPATH += $$PWD/Logic
DEPENDPATH += $$PWD/Logic
Run Code Online (Sandbox Code Playgroud)
在这种情况下,使用将Subdirs代码模块彼此分开是一个好主意。这样您就可以拥有可重复使用且易于更改的独立软件模块。它还使项目更加清晰且更易于阅读。
在这种方法中,模块可以通过信号和插槽相互交互,这使得不同的组件完全独立,并且更改一个模块不需要更改其他部分。
Qt Creator 在使各个部分相互喜欢方面提供了良好的自动化。您可以创建一个 Subdirs 项目并将子项目添加到其 .pro 文件中:
TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS += \
Component1 \
Component2 \
Component3 \
MainApp \
Run Code Online (Sandbox Code Playgroud)
您应该将其他人依赖的子项目放在列表的第一位。另请注意,子项目的 .pro 文件的名称应与其文件夹名称相同。这样子项目就会被检测到并列在“项目”窗格中。
子项目Component1,Component2和Component3可以是图书馆。.pro 文件的一部分Component1:
TARGET = Component1
TEMPLATE = lib
DEFINES += COMPONENT1_LIBRARY
SOURCES += ...
HEADERS += ...
Run Code Online (Sandbox Code Playgroud)
子项目MainApp可以是app。.pro 文件的一部分MainApp:
TARGET = MainApp
TEMPLATE = app
Run Code Online (Sandbox Code Playgroud)
您可以通过将每个子项目链接到子项目来使用该库。这可以通过右键单击子项目并选择“添加库”然后选择“内部库”来完成。当您从子项目列表中选择一个库时,链接配置将自动添加到 .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
Run Code Online (Sandbox Code Playgroud)