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

Qt模型/视图体系结构-如何处理更复杂的模型,qt,model,Qt,Model,Qt中的模型是否应该或多或少地符合模型,从而最终由列表、表格或树表示?如果您的模型要复杂得多,并且不能用列表、表或树来表示,该怎么办 如果是这样的话,我会认为这只会让模型变成数据;类似于XML文件或电子表格的东西 示例:如果所讨论的应用程序中的模型是更复杂的东西,如汽车,该怎么办?我会假设汽车模型将包含关于汽车的所有类型的数据和业务规则。将有一个引擎,车轮,一个框架,和许多其他不同的组成部分一起工作,创造整个汽车。每个组件都有自己独特的行为:框架有颜色,引擎有温度,立体声有音量设置,等等。而且每

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

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


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

尝试在这里阅读Qt中的MV:,当然,也可以在以下资源中阅读。此外,还有很多由VoidRealms制作的有趣视频,包括这个主题--


试着从总体上理解它,特别是在Qt中,所有的问题和你们的误解都会消失

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

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

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-data[5]={0,2,4,6,8};
void查看器(int*数据,int n){
对于(int ii=0;ii
这是:

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);
}
int模型(int索引){
收益指数*2;
}
typedef int(*模型函数)(int);
void查看器(模型\函数模型,int n){
对于(int ii=0;ii

两者都将为您提供
0、2、4、6、8
,但是模型实际上不需要数组来提供相同的值。

您真的有问题吗?这是一个质量保证网站,你需要问具体的,可回答的问题。“我想我是误解了”不是一个问题。我编辑了我原来的帖子,使之更像是一个单一的、直接的问题。希望现在它更友好。对于最初缺乏重点/清晰性,我深表歉意。我想我想要的评论是@leemes在第一个链接中给出的第二个答案:“Qt的MVC只适用于一个数据结构。当谈论MVC应用程序时,你不应该考虑QabstracteModel或QListView。”VoidRealms视频很好地解释了如何在Qt中使用ListView来表示字符串列表。正如我在最初的问题中所解释的那样,我试图找出如何做更复杂的事情。我没有看到如何在应用程序规模上实现模型/视图框架,也没有看到如何实现复杂模型(例如汽车)。那么汽车对象(包括其所有特性和行为)实际上不是模型/视图框架的一部分吗?根据你的解释,在我看来,这个模型是根据汽车制造的,但它并不代表汽车本身。它是实际汽车对象(我以前认为是模型)和视图之间的某种中介。你可以这么说。这就是为什么使用“模型”这个词——它是汽车的模型。更像是一个界面,真的。关键是,视图查询模型,而不知道其背后是什么。模型就像视图和实际对象之间的中间人或接口。这样,如果对象发生更改,则只需更改模型,但视图可以保持不变。因此,模型和它描述的底层对象是不同的。在Qt中,我认为您示例中的整数列表可以使用QListItemModel表示。但是,如果我们处理的是更复杂的数据结构(如上面所述的汽车),我会假设您基本上无法构建自己的模型类,在这种情况下,您将从QabstracteModel开始。是这样吗?此外,我不知道从何处开始查看,但我认为这将是一个类似的从头开始的工作,因为列表/表格/树(可能)不足以直观地表示汽车。这完全取决于您希望显示对象的哪个方面。汽车可以用描述其型号、发动机和相关特性的文本来表示,您可以将其放在表格中。它也可以用类似3D Studio的模拟来表示。你不能把它放在桌子上。另一个例子是,对话可以通过文本、音频记录或视频记录来表示。在本例中,同一对象有3个不同的模型。对象的描述不是对象本身。您可以在表中表示汽车,它只需要是文本表示。关于Qt类的细节:在对话的示例中,听起来您可能会使用QAbstractItemModel为音频和/或视频构建模型,而如果它以文本的形式直观表示,您可能会坚持使用QListItemModel。