2012-11-17 63 views
3

Qt中的模型是否应该或多或少地适合模具 - 因此最终可以用列表,表格或树来表示?如果你的模型复杂得多,不能用列表,表格或树来表示呢?Qt模型/视图体系结构 - 如何处理更复杂的模型

如果是这样的话,我会认为这只是一个模型,不过是数据;与XML文件或电子表格相媲美的东西。

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

+0

你真的有问题吗?这是一个质量保证网站,您需要提出具体的,可回答的问题。 “我认为我是误解”不是一个问题。 – sashoalm

+0

我编辑了我原来的帖子,以更直接的形式直接提出问题。希望现在它对QA更友好。我对最初缺乏重点/清晰度表示歉意。 – nairware

回答

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

+0

汽车对象也是如此 - 包括它的所有特征和行为 - 实际上不是模型/视图框架的一部分?根据你的解释,这听起来像是模型是建立在汽车之外的,但它并不代表汽车本身。它是真正的汽车对象(我以前认为是模型)和视图之间的某种媒介。 – nairware

+0

你可以这么说。这就是为什么使用“模型”这个词 - 它是汽车的典范。更像是一个界面,真的。关键是,视图查询模型,而不知道它背后是什么。该模型就像一个中间人,或者视图与实际对象之间的接口。这样,如果对象发生变化,则只需更改模型,但视图可以保持不变。所以它描述的模型和底层对象是不一样的。 – sashoalm

+0

在Qt中,我认为您的示例中的整数列表可以使用QListItemModel来表示。但是,如果我们有一个更复杂的数据结构(例如上面描述的汽车),我会假设你会基本上坚持构建你自己的模型类,在这种情况下,你会从QAbstractItemModel开始。是这样吗?此外,我不知道该从哪里开始,但我会认为这将是一个类似的从头开始的努力,因为列表/表格/树可能(可能)不足以可视地表示汽车。 – nairware

1

试着在这里阅读有关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中它是如何的,所有的问题和你的误解都会消失。

+0

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