C++ GUI/控制台应用程序代码管理(C+;+;/Qt)

C++ GUI/控制台应用程序代码管理(C+;+;/Qt),c++,qt,user-interface,C++,Qt,User Interface,我正在设计一个应用程序,应该作为GUI或控制台(命令行)应用程序。一次一种模式。当应用程序被编译为控制台时,它不应该使用任何GUI库。由于我是第一次做这样的事情,我想问一下这种情况下的陷阱、技巧和窍门。什么方法最好?只需使用诸如#define with gui 1之类的宏即可切换?或者制作类似于客户机/服务器解决方案的东西?我会将业务逻辑和GUI完全分离到独立的库中,每个库一个。在控制台应用程序模式下,我将链接到包含逻辑部分的唯一库,否则将链接到两个库。有了它,您就不需要在代码中的任何地方都放置

我正在设计一个应用程序,应该作为GUI或控制台(命令行)应用程序。一次一种模式。当应用程序被编译为控制台时,它不应该使用任何GUI库。由于我是第一次做这样的事情,我想问一下这种情况下的陷阱、技巧和窍门。什么方法最好?只需使用诸如
#define with gui 1
之类的宏即可切换?或者制作类似于客户机/服务器解决方案的东西?

我会将业务逻辑和GUI完全分离到独立的库中,每个库一个。在控制台应用程序模式下,我将链接到包含逻辑部分的唯一库,否则将链接到两个库。有了它,您就不需要在代码中的任何地方都放置ifdef-s,也不需要让代码变得难以阅读。

有一种称为ifdef-s的设计模式。这将数据的表示与数据模型本身分离,控制器充当委托,通过对模型的更新控制视图的更新

Qt提供了一个模型,但只使用模型和视图

这里重点关注的是将数据模型与其可视化表示分离。做到这一点,维护应用程序的GUI和控制台版本将非常简单


有了信号和插槽,它非常简单;视图(GUI或命令行)所做的任何更改都会导致模型拾取信号。同样,当模型中的数据发生更改时,会为连接的视图发出信号,以更新该数据的表示形式。

我只想补充一点,“独立库”可以是静态库,然后选择哪个链接到应用程序可执行文件。使用预处理器定义实现即使在C中也是不好的。甚至不要考虑这样做。需要注意的是,控制台应用程序应该使用
QCoreApplication
(或子类),而GUI版本应该使用类似
QApplication
的东西。最好有两个subdir项目,它们为控制台和GUI生成单独的应用程序。然后在第三个子项目中共享(不依赖GUI)代码,这是一个库。使用Qt模型视图框架的缺点是,从控制台版本使用它可能需要一点甚至很多工作,这取决于需要什么功能。根据数据类型的不同,可能更容易使用更简单的东西来保存实际数据,然后可能只在GUI部分使用QAbstractItemModel(使用访问共享数据存储的自定义模型)。@hyde,我完全同意。我提到MVC和Qt的模型视图框架更多的是为了更好的设计提供参考,而不是暗示应该直接使用它。也许我说得不够清楚。不,你对整个想法很清楚,我只是想说明一下在控制台上使用Qt-MV框架的观点。