【问题标题】:Qt Model/View Architecture - How to Handle More Complex ModelsQt 模型/视图架构 - 如何处理更复杂的模型
【发布时间】:2012-11-06 06:31:55
【问题描述】:

Qt 中的模型是否应该或多或少地适合模型——因此最终由列表、表格或树来表示?如果您的模型要复杂得多并且不能用列表、表格或树表示怎么办?

如果是这样的话,我认为这只会让模型变成数据;类似于 XML 文件或电子表格的东西。

示例:如果所讨论的应用程序中的模型是更复杂的东西,比如汽车,该怎么办?我会假设汽车的模型将包括关于汽车的所有类型的数据和业务规则。将有发动机、车轮、车架和许多其他不同的组件,它们一起工作来制造整辆汽车。每个组件都有自己独特的一组行为:框架有颜色,引擎有温度,立体声有音量设置,等等。每个组件也会有行为:如果踩下油门踏板,车轮就会转动,发动机就会升温。显然,QStringListModel 或其他一些内置的简化模型无法恰当地解决汽车中的所有复杂问题。

【问题讨论】:

  • 你真的有问题吗?这是一个 QA 网站,您需要提出具体的、可回答的问题。 “我认为我误解了”不是问题。
  • 我编辑了我的原始帖子,使其更加以单一、直接的问题的形式出现。希望现在它对 QA 更友好。对于最初缺乏重点/清晰度,我深表歉意。

标签: qt model


【解决方案1】:

模型不是数据,而是一组回调。事实上,模型背后不需要有真实数据。它更像是一个被查询的服务器。

这就像这之间的区别:

int data[5] = { 0, 2, 4, 6, 8 };
void viewer(int *data, int n) {
    for (int ii = 0; ii < n; ii++)
        printf("%d, ", data[ii]);
}
int main() {
    viewer(data, 5);
}

还有这个:

int model(int index) {
    return index * 2;
}
typedef int (*model_function)(int);
void viewer(model_function model, int n) {
    for (int ii = 0; ii < n; ii++)
        printf("%d, ", model(ii));
}
int main() {
    viewer(model, 5);
}

两者都会给你0, 2, 4, 6, 8,但模型实际上并不需要一个数组来提供相同的值。

【讨论】:

  • 那么汽车对象——包括它的所有特性和行为——实际上不是模型/视图框架的一部分吗?根据您的解释,在我看来,该模型是由汽车制成的,但它并不代表汽车本身。它是实际汽车对象(我之前认为是模型)和视图之间的某种中介。
  • 你可以这么说。这就是为什么使用“模型”这个词的原因——它是汽车的模型。更像是一个界面,真的。关键是,视图查询模型,而不知道它背后的内容。模型充当视图和实际对象之间的中间人或接口。这样,如果对象发生变化,您只需要更改模型,但视图可以保持不变。所以模型和它描述的底层对象是不一样的。
  • 在 Qt 中,我认为您的示例中的整数列表可以使用 QListItemModel 表示。但是,如果我们有一个更复杂的数据结构来处理(例如上面描述的汽车),我会假设您基本上会陷入构建自己的模型类的困境,在这种情况下,您将从 QAbstractItemModel 开始。是这样吗?另外,我不知道从哪里开始视图,但我认为这将是一个类似的从头开始的工作,因为列表/表格/树(可能)不足以直观地表示汽车。
  • 这完全取决于您要显示对象的哪个方面。汽车可以用描述其型号、发动机和相关特征的文本来表示,您可以将这些文本放在表格中。它也可以通过类似 3D Studio 的模拟来表示。你不能把它放在桌子上。作为另一个示例,对话可以由文本、音频记录或视频记录来表示。在这种情况下,您将拥有同一对象的 3 个不同模型。对象的描述不是对象本身。您可以在表格中表示汽车,它只需要是文本表示即可。
  • 关于 Qt 类细节:在对话的示例中,听起来您可能会使用 QAbstractItemModel 为音频和/或视频构建模型,而如果要以文本形式直观地表示,您可能会坚持使用 QListItemModel。
【解决方案2】:

尝试在此处阅读有关 Qt 中的 MV:similar question on SO,当然还有 Model/View Programming at http://qt-project.org/ 等资源。另外,VoidRealms 也有很多有趣的视频,包括这个主题——VoidRealms: C++ Qt 47 - Intro to model view programming

尝试从总体上理解它,尤其是在特定情况下——它在 Qt 中的表现,所有的问题和你的误解都会消失。

【讨论】:

  • 我认为我正在寻找的评论是@leemes 在第一个链接中的第二个答案:“Qt 的 MVC 仅适用于一个数据结构。在谈论 MVC 应用程序时,您不应该考虑 QAbstractItemModel或 QListView。” VoidRealms 视频很好地解释了在 Qt 中使用 ListView 来表示字符串列表。正如我在最初的问题中解释的那样,我试图弄清楚如何做更复杂的事情。我没有看到如何在应用程序规模上实现模型/视图框架,也没有看到如何实现复杂模型(例如汽车)。
猜你喜欢
  • 2012-11-23
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多