【发布时间】:2021-07-25 16:30:25
【问题描述】:
我的应用程序有MainWindow,分为三个主要部分:
问题是,所有三个部分都需要在它们之间进行通信。例如,在左侧部分有一个QListView,您可以在其中选择项目,并根据所选项目在右侧部分更改选项。
我想出了三个解决方案:
- 在
MainWindow中绘制所有内容,这将使MainWindow成为一个大超类:
此解决方案解决了小部件之间通信的所有问题,因为它们都是 MainWindow::ui 的一部分,但随后我得到了一个大(可能是混乱的)类。
- 将每个部分放在自己的类中,并使
MainWindow成为单例:
这个解决方案是......好吧,一个单身人士。而且我真的不喜欢单身人士。我将可以从任何地方访问MainWindow(本质上我正在创建一个全局变量),我仍然必须通过getter 公开MainWindow::ui(以及其他部分的::uis),这意味着一切都可以访问::uis.
- 将每个部分放在自己的类中,并通过信号和插槽连接所有内容:
这可能是最好的解决方案,但是使用此解决方案,我需要为 EachSection::ui 中的每个小部件创建 getter(以便能够在 MainWindow 中将其与其对应的部件连接起来),我需要大量调用connect() 如果两个插槽对相同的信号做出反应,但它们需要按特定顺序做出反应,我也会遇到问题。
那么最好的方法是什么?
【问题讨论】:
-
一个基于意见的问题。无论如何,你应该按照它们的用途来划分你的 UI 元素,所以如果你认为有很多元素直接属于
MainWindow,只需将它们全部放在MainWindowUI 中。在 QT 中,通过调用myObj->findChild<QWhatever*>()很容易访问子对象。如果您的MainWindow的某些部分是具有自己特定行为的复杂小部件,只需将其设为一个单独的类,并将该类的一个或多个实例放入您的MainWinowUI 中。 -
我建议编辑问题并将其集中在解决方案之一的某些特定问题上。我的快速猜测是您想要方法 1 或 3。
标签: c++ qt architecture