Qt模型/视图架构 - 如何处理更复杂的模型

4

在Qt中,模型是否应该更多或更少地符合列表、表格或树形结构的模式,从而最终被它们所代表?如果您的模型更加复杂,不能由列表、表格或树形结构表示,那怎么办?

如果是这种情况,我认为模型就只是数据;类似于XML文件或电子表格。

例如:如果应用程序中的模型是一辆车之类的更复杂的东西,那会怎样呢?我想汽车的模型将包括有关汽车的所有数据和业务规则。它将有一个发动机、轮子、车架和许多其他不同的组件,它们共同工作来创建整个汽车。每个组件都有自己独特的行为:车架会有颜色,发动机会有温度,立体声音响会有音量设置等等。每个组件也都有自己的行为:如果踩油门,车轮会转动,发动机会升温。显然,QStringListModel或其他内置的简化模型无法适当地解决汽车中所有的复杂性。


你真的有问题吗?这是一个问答网站,你需要提出具体可回答的问题。“我想我误解了”不是一个问题。 - sashoalm
我编辑了原始帖子,使其更符合单一、直接问题的形式。希望现在更容易进行问答。初期缺乏重点/清晰度,对此我深感抱歉。 - nairware
2个回答

2

一个模型不是数据,而是一组回调函数。实际上,模型后面没有必须留下真实的数据。它更像是一个可供查询的服务器。

这就像这两者之间的区别:

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,但是模型实际上不需要一个数组来产生相同的值。


那么汽车对象——包括其所有功能和行为——实际上并不是模型/视图框架的一部分吗?根据您的解释,我认为模型是基于汽车构建的,但它并不代表汽车本身。它是实际汽车对象(我之前认为是模型)和视图之间的某种中介。 - nairware
你可以这么说。这就是为什么使用“模型”这个词 - 它是汽车的模型。实际上更像是一个接口。重点是,视图查询模型,而不知道它背后的内容。模型充当视图和实际对象之间的中间人或接口。这样,如果对象发生变化,您只需要更改模型,但视图可以保持不变。因此,描述其下层对象的模型与其本身并不相同。 - sashoalm
在Qt中,我认为你的示例中的整数列表可以使用QListItemModel表示。但是,如果我们处理更复杂的数据结构(例如上面描述的汽车),我会假设你基本上会构建自己的模型类,在这种情况下,你将从QAbstractItemModel开始。是这样吗?此外,我不知道如何开始视图,但我会假设这将是一个类似于从头开始的努力,因为列表/表/树(可能)不能足够地可视化表示汽车。 - nairware
完全取决于您想展示对象的哪个方面。汽车可以通过描述其型号、发动机和相关特征的文本来表示,这些信息可以放在表格中。它也可以通过类似于3D Studio的模拟来表示,这是无法放在表格中的。另一个例子是,对话可以用文本、音频录音或视频录制来表示。在这种情况下,您将拥有同一对象的3种不同模型。对象的描述并不等同于对象本身。您可以在表格中表示汽车,只需要是文本表示即可。 - sashoalm
关于Qt类的具体细节:在对话示例中,听起来您可能会使用QAbstractItemModel构建音频和/或视频模型,而如果要将其以文本形式呈现,则可能会坚持使用QListItemModel。 - nairware

1

我认为我正在寻找的评论是第一个链接中@leemes的第二个答案:“Qt的MVC仅适用于一个数据结构。在谈论MVC应用程序时,您不应考虑QAbstractItemModel或QListView。” VoidRealms视频是使用Qt中的ListView表示字符串列表的好说明。正如我在我的原始问题中所解释的那样,我正在尝试弄清楚如何做更复杂的事情。我没有看到如何在应用程序范围内实现模型/视图框架,也没有看到如何实现复杂的模型(例如汽车)。 - nairware

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接