【问题标题】:Preferred way to design application arhitecture in Qt在 Qt 中设计应用程序架构的首选方法
【发布时间】:2021-07-25 16:30:25
【问题描述】:

我的应用程序有MainWindow,分为三个主要部分:

问题是,所有三个部分都需要在它们之间进行通信。例如,在左侧部分有一个QListView,您可以在其中选择项目,并根据所选项目在右侧部分更改选项。

我想出了三个解决方案:

  1. MainWindow 中绘制所有内容,这将使MainWindow 成为一个大超类:

此解决方案解决了小部件之间通信的所有问题,因为它们都是 MainWindow::ui 的一部分,但随后我得到了一个大(可能是混乱的)类。

  1. 将每个部分放在自己的类中,并使MainWindow 成为单例:

这个解决方案是......好吧,一个单身人士。而且我真的不喜欢单身人士。我将可以从任何地方访问MainWindow(本质上我正在创建一个全局变量),我仍然必须通过getter 公开MainWindow::ui(以及其他部分的::uis),这意味着一切都可以访问::uis.

  1. 将每个部分放在自己的类中,并通过信号和插槽连接所有内容:

这可能是最好的解决方案,但是使用此解决方案,我需要为 EachSection::ui 中的每个小部件创建 getter(以便能够在 MainWindow 中将其与其对应的部件连接起来),我需要大量调用connect() 如果两个插槽对相同的信号做出反应,但它们需要按特定顺序做出反应,我也会遇到问题。

那么最好的方法是什么?

【问题讨论】:

  • 一个基于意见的问题。无论如何,你应该按照它们的用途来划分你的 UI 元素,所以如果你认为有很多元素直接属于 MainWindow,只需将它们全部放在 MainWindow UI 中。在 QT 中,通过调用 myObj->findChild<QWhatever*>() 很容易访问子对象。如果您的MainWindow 的某些部分是具有自己特定行为的复杂小部件,只需将其设为一个单独的类,并将该类的一个或多个实例放入您的MainWinow UI 中。
  • 我建议编辑问题并将其集中在解决方案之一的某些特定问题上。我的快速猜测是您想要方法 1 或 3。

标签: c++ qt architecture


【解决方案1】:

最好的方法是定义视图之间的消息传递(协议),这样视图就不是紧密耦合的(所有视图都是隔离的并且彼此不了解),一个实例类(主窗口)知道所有这三个并将它们连接起来。想象一个按钮行编辑和标签,当你按下按钮标签时获得行编辑的值,按钮实现不依赖于 lineedit 实现,lineedit 不依赖于 label 等等,这三个类都可以扩展或更改并且不影响另外两个,所以你可以专注于其中一个。

【讨论】:

    猜你喜欢
    • 2011-08-03
    • 2015-04-18
    • 2023-03-25
    • 1970-01-01
    • 2023-03-18
    • 2011-09-30
    • 1970-01-01
    • 2011-01-15
    • 2010-10-30
    相关资源
    最近更新 更多