c++ - 逻辑和UI分离

标签 c++ qt separation-of-concerns

我正在 Qt 中开发 GUI 应用程序。

这是我的第一个 GUI 应用程序,我不是很有经验,仍然需要努力学习 C++ 和 Qt 框架的一些更高级的方面。

该应用程序非常简单,具有一个主窗口和一些对话框,用户可以在其中配置设置并按下按钮,程序执行(相当复杂的)计算,在 UI 的某个位置给出结果。

现在,我遇到了一个问题。我将我所有的计算数据(它是静态的并且从资源中加载)和逻辑放在一个单独的类中。我创建了此类和 UI 类的实例。现在,问题是如何从 UI 类访问数据/逻辑类的成员?假设 Logic 类中有一个 QStringList,我希望某个对话框访问该列表并将其呈现给用户,而不在内存中复制它?

我知道这可能是一个非常基本的 C++ 问题(Qt 甚至不相关),但不是每个人都是编程向导。感谢您的任何提示或帮助!

最佳答案

有几种方法可以做到这一点,所以你的问题是有效的。

  1. 您的 GUI 类可以派生自您的逻辑类。不是典型的方法,但它取决于您的应用程序的设计方式。一个主要缺点是,如果您不想在逻辑类中涉及锁定机制,则 GUI 必须与逻辑保持在同一线程中。通常您希望两个对象在单独的线程中运行,这样繁重的计算就不会卡住 GUI(参见 Qt 的 QObject thread affinity)。

  2. 您的 GUI 类可以包含指向您的逻辑类的指针,反之亦然。如果您的逻辑类存在于 GUI 类之前并继续存在,它也可以作为方便的引用。然后您可以将引用传递给 GUI 类的构造函数,而您永远不必测试指针是否有效。

  3. 您的 GUI 类可以通过 getter/setter 或直接访问数据成员,如果您想让它们公开或简单地将您的 GUI 类定义为 Logic 类的 friend 类。即使您使用 getter,它们也可以返回 const 引用,因此不涉及复制。像 QStringList 这样的 Qt 类也有自己的引用计数、写时复制机制,可以避免复制。

  4. 您的 GUI 类可以发出信号,而 Logic 类可以接收信号。请参见 Qt 信号/槽机制。这对于“开始计算”按钮之类的事件非常有用。信号有两个优点:(a)它们可以跨线程,但是如果接收者不是主循环,它会变得有点棘手; (b) 对象不必相互看到(没有指针传递),您可以将信号连接到程序中同时看到两个对象的任何位置的槽。

通常您会混合使用 2 和 3:使用 getter 从呈现给用户的 Logic 类中读取数据。使用信号来激发 Action 或操纵数据(用户做出选择,逻辑类必须使用react)。

关于c++ - 逻辑和UI分离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7051185/

相关文章:

c++ - 带括号和不带括号实例化的对象到底有什么区别?

c++ - qml 从 C++ 设置文本属性

design-patterns - Concern 和 Responsibility 的区别(即 SRP 和 SoC 的区别)?

c++ - Qt Creator 链接错误 : undefined reference to `KFUNC'

php - 我应该在表示层中抛出异常吗?

asp.net-mvc - Asp.Net MVC 操作 - 关注点分离/单一职责原则

c++ - 是否可以在 Windows 登录屏幕上显示我的窗口?

c++ - 在 `for` 循环内递增后,迭代器结束检查失败

c++ - Windows Phone 的 RegistryNotifyCallback 等效项

c++ - Qt API 中仅使用普通指针