c++ - 在 Qt 中设计应用程序架构的首选方法
问题描述
我的应用程序MainWindow
分为三个主要部分:
问题是,所有三个部分都需要在它们之间进行通信。例如,您可以QListView
在左侧部分选择项目,并根据所选项目选项在右侧部分更改。
我提出了三个解决方案:
- 绘制其中的所有内容,
MainWindow
这将成为MainWindow
一个大的超类:
该解决方案解决了小部件之间通信的所有问题,因为它们都是其中的一部分,MainWindow::ui
但随后我得到了一个大(可能是混乱的)类。
- 将每个部分放在它自己的类中并制作
MainWindow
一个单例:
这个解决方案是......好吧,一个单身人士。而且我真的不喜欢单身人士。我将可以MainWindow
从任何地方访问(本质上我正在创建一个全局变量),并且我仍然必须通过 getter 公开MainWindow::ui
(以及::ui
其他部分的 s),这意味着一切都可以访问::ui
s。
- 将每个部分放在它自己的类中,并通过信号和插槽连接所有内容:
这可能是最好的解决方案,但是使用此解决方案,我需要为每个小部件创建 getter EachSection::ui
(以便能够将其MainWindow
与其对应的部件连接起来),我需要大量调用,connect()
如果有两个插槽,我也会遇到问题对相同的信号做出反应,但它们需要按特定顺序做出反应。
那么最好的方法是什么?
解决方案
最好的方法是定义视图之间的消息传递(协议),以便视图不是紧密耦合的(所有视图都是隔离的并且彼此不了解)一个实例类(主窗口)知道所有三个并将它们连接起来。想象一个按钮行编辑和标签,当你按下按钮标签时获得行编辑的值,按钮实现不依赖于lineedit实现,lineedit不依赖于标签等等,这三个类都可以扩展或改变并且不影响另外两个,因此您当时可以专注于其中一个。
推荐阅读
- python - kivymd 的颜色定义问题
- docker - 通过 DirectAccess 连接到远程 docker 注册表
- python - Matplotlic Color by y-value Plot Draw Error
- c# - 主窗体 C# 的用户控件
- javascript - HTML JS - 通过 CSS 类禁用点击可能性
- python - tensorflow内存消耗不断增加
- sql - 'U' 的错误语法 .... MSSQL
- sqlite - 如何使用外键插入 sqlite 表
- javascript - React Redux - props.createMovie 不是一个函数
- sql - 没有替换的sql join,所以一行只join一次?