gpt4 book ai didi

c++ - 关于分离逻辑 (C++) 和 GUI (Qt) 的概念和基本问题

转载 作者:IT老高 更新时间:2023-10-28 22:30:23 30 4
gpt4 key购买 nike

我在 C++ 完成了一个项目.它是一个控制台应用程序,使用 CodeBlocks 创建。尽管我认为在这个问题的范围内它不是那么重要:该应用程序管理有关一家小公司的账单和客户的数据。该程序是完整的,可以很容易地通过控制台用户界面进行扩展(现在,我以程序员的身份运行它)。

现在我决定使用 Qt 来学习 GUI 编程。以及带有 QtDesigner 的 QtCreator!

不仅是因为在创建 GUI 应用程序时将逻辑与 GUI 分开是常见的做法,我想将我的项目分为两大部分来实践,即,当然,逻辑 界面 .
你已经知道逻辑部分已经完成了;我有一个名为 project 的项目文件夹包含另一个文件夹(CodeBlocks 项目)project_logic它再次包含几个类,因此包含头文件和实现文件(以及一个 main,当然最终会过时)。它还包含程序读取/写入的文件。写的是“纯”C++并且不使用 Qt 提供的任何方式保持这种状态对我来说很重要!

现在我添加了一个 Qt项目project_guiproject -folder 并开始创建 GUI,仅实现最基本的功能,例如在对话之间切换、关闭应用程序等。到目前为止,它对 future 的后端 ( project_logic ) 一无所知。

作为第三个组件,我需要某种 控制它将应用程序的逻辑与其 GUI 联系起来。这是我的概念性问题:将它们组合到一个应用程序中的最佳方法是什么?

建议

  • project_logic可以单独作为一个控制台应用程序工作,它已经提供了最重要的控制组件和功能。这将保持这种方式,因为我想保留其独立功能。更重要的是,因为我完全不熟悉 GUI 编程和/或在两周内我可能碰巧为相同的逻辑创建另一个 GUI。结果将是逻辑部分的类像任何其他头文件一样包含在 GUI 源中,并用于创建具有完整功能的程序。验证用户输入将取决于 GUI 部分。无论如何,程序的逻辑将保持可更新。
  • 使 GUI 尽可能可重用;我应该实现第三个组件 à la project_controlling提供 GUI 和逻辑之间的交互(通过控制完成用户输入验证),因为两者中的每一个都尽可能保持独立? GUI 不包括逻辑头,可以这么说,但包括控制头?


  • 我承认,第二点可能听起来有点奇怪。简而言之,我的目标是:
  • 保持project_logic标准C++和独立的(在修补、添加功能等方面...)和
  • 使用 Qt GUI 最大限度地(同时合理)分离 GUI 和逻辑。

  • 思绪的列车
  • 我应该包括 project_logic标题通过 #include "../project_logic/header1.h"等等? (使用类可能有问题,我将在单独的问题中发布。)
  • 我应该将它们作为子项目吗?
  • 我将如何“在代码中”连接部件?
  • 逻辑函数是否还能找到我之前提到的文件(读/写)?


  • 请记住以下几点:我是 GUI 编程的新手!我尽力解释我的想法/问题......但是,我知道 C 和 C++ 并编写我使用的控制台应用程序,例如我认为在大学进行模拟并且可以很好地处理标准的东西。即使潜在的回答者想提出一种非常不同的方法,我也会很感激我提出的概念的“解决方案”。原因我在介绍中解释过。不用说,我当然有兴趣听取不同的建议。

    在我做了一些研究之后,我决定发布这个问题,并在之前以“试错”方式尽力而为。 StackOverflow 和其他板上有很多关于这个主题的信息,所以我想提出我的想法并收集批评和意见,而不是添加另一个“如何做?”问题的大杂烩。

    由于这个问题是关于一般方法的,我可能会(非常确定...... :-P )稍后提出更多技术问题,我想在它们出现时立即将其编辑到这个问题(超链接)中。
    但是,当然,欢迎提供这方面的基本食谱(如果有)。

    在发表了一些评论和回答之后,我想发布一些 EDIT 只是为了让事情清楚:

    逻辑的现状
  • project_logic或多或少已完成并在 CodeBlocks 中编码为 CodeBlocks 项目。
  • 它可以作为具有“控制台用户界面”的控制台应用程序工作。 (它有一个 main.cpp,现在只用于调试。)
  • 它的组件尽可能分成类(头文件和cpp实现文件)。

  • GUI的现状
  • project_gui正在设置为 Qt-Widget-Application 项目(使用 QtCreator/Designer)。
  • 到目前为止,它只是 GUI,仅此而已(与 project_logic 没有任何联系)。

  • 目标和...

    ... 工作流程 ,我想跟着,因为这是我的第一个大项目:
  • project_logicproject_gui不会离开各自的目录;他们都在一个名为 project 的目录中. (异常(exception):如有必要,逻辑将导出为 dll(或类似的东西),然后提供给 GUI。)
  • 如果在 project_logic 中有要更改的内容我想在 CodeBlocks 中这样做(并重复上述可能的导出)。
  • project_logic (或任何第三层,例如 project_controlling )必须一次性用于 project_gui以可以想象到的最简单的方式......(见思路1):-P
  • 最佳答案

    欢迎来到 SO。

    您在这里确实将两三个问题捆绑在一起,但让我们试一试:

    As a third component I need some kind of controlling which links the application's logic with its GUI.



    由于您使用的是 Qt,因此您对这个问题有一个内置的答案:

    Qt Project-Model/View Programming .让您开始:

    模型/ View 架构

    Model-View-Controller (MVC) is a design pattern originating from Smalltalk that is often used when building user interfaces. In Design Patterns, Gamma et al. write:

    MVC consists of three kinds of objects. The Model is the application object, the View is its screen presentation, and the Controller defines the way the user interface reacts to user input. Before MVC, user interface designs tended to lump these objects together. MVC decouples them to increase flexibility and reuse.

    If the view and the controller objects are combined, the result is the model/view architecture. This still separates the way that data is stored from the way that it is presented to the user, but provides a simpler framework based on the same principles. This separation makes it possible to display the same data in several different views, and to implement new types of views, without changing the underlying data structures. To allow flexible handling of user input, we introduce the concept of the delegate. The advantage of having a delegate in this framework is that it allows the way items of data are rendered and edited to be customized.



    QT 框架明确支持的 MVC 模型(也可能与其他 GUI 框架一起实现,尽管需要做更多工作),被广泛接受为一组健壮、灵活的设计模式,可提供各种应用程序层的管理和分离,以您正在考虑的方式 - 所以您走在正确的轨道上。

    The second point may sound a little bit weird, I admit; to put it short, my aims are...



    如何设置您的源代码项目的问题实际上与您的应用程序架构本身无关,尽管这些领域通常是交叉的,因此良好的项目组织有助于更轻松地实现您的架构,反之亦然。您如何组织您的项目及其各种库和类可能不仅取决于您现在正在处理的项目,还取决于 future 项目的计划。例如,正如您提到的,您可能想要设计可用于多个不同应用程序的某些 GUI 组件。如果是这样,您可能希望将您的 GUI 模块放入一个单独的可重用通用库中,该库可供许多应用程序使用。

    然而,某些规则是全面适用的,并且大多数有经验的开发人员都遵循——这里有一些重要的规则,还有更多:
  • 每个单元一个主要类及其 friend 类(hpp/cpp 文件)。
  • 非常小心您在头文件中包含的内容以及您留给 CPP 文件的内容。你会找到
    这里关于 SO 和任何关于这个主题的好的 C++ 书中的指南,这是
    非常重要,尤其是在复杂的项目中。 (从声音
    它 - 例如您关于如何使用 #include 的问题和“连接零件
    “在代码中 - 你需要更好地掌握一些基础知识
    C++ 编程。一些优秀的书在那里 - 你可以找到
    在这里列出。 C++ Primer (5thEdition)
    是最好的起点之一。)
  • 分解你的类和库
    功能。大多数 IDES 支持项目中的虚拟子文件夹
    (不确定 Code::Blocks)以帮助保持组织有序
    方式。这实际上涉及基本的设计问题,而不是
    只是如何在您的项目中布置代码。
  • 避免 tight coupling!

    In software engineering, coupling or dependency is the degree to which each program module relies on each one of the other modules.

    Coupling is usually contrasted with cohesion. Low coupling often correlates with high cohesion, and vice versa. Low coupling is often a sign of a well-structured computer system and a good design, and when combined with high cohesion, supports the general goals of high readability and maintainability.

  • 善用 namespaces ,另一个很棒的语言功能,有助于保持模块化和组织性。

  • 在您的情况下,您似乎想要做的是将您的“应用程序逻辑”打包到一个库中,将通用 GUI 模块打包到第二个库中,然后是第三个瘦可执行文件 - 也许只包含 main()和几行代码来启动并在完成后关闭它们 - 启动 Qt 应用程序并初始化库中的类,这些类使用 MVC 模型进行交互并执行应用程序的实际工作。三个单独的模块不是必需的,尽管它会更“通用”和可重用,并且更容易保持组织方式。

    您确实通过这个问题触及了各种各样的主题,同样,其中一些主题与 C++ 编程基础有关,而不仅仅是“将应用程序逻辑与 GUI 分离”。希望这个答案能帮助你朝着正确的方向前进。

    重要提示: GUI 编程是一个完整且不是特别容易的编程分支。有 GUI 专家,也有只最低限度地使用 GUI 的程序员。 (我是后一组之一)。有一个 SE 站点叫 User Experience虽然它不处理 GUI 编程本身,处理用户如何与系统交互,这与 GUI 编程技术直接相关。因此,当您说“现在我决定学习 GUI 编程”时,要知道您正在承担一项重要工作。如果您对使 GUI 编程成为您的专长并不真正感兴趣,您可能需要考虑使用向导和预制的 GUI 解决方案,而不是手工完成所有工作。 QtCreator 确实提供了一些这样的支持,Code::Blocks 也是如此。如果您打算开展这项严肃的业务,也可以使用商业框架。除非您只是为了学习而这样做,否则不建议将重新发明轮子用于严肃的商业编程工作。

    关于c++ - 关于分离逻辑 (C++) 和 GUI (Qt) 的概念和基本问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25099630/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com