嵌套模型/视图架构

Posted

技术标签:

【中文标题】嵌套模型/视图架构【英文标题】:Nested model/view architecture [closed] 【发布时间】:2014-07-18 12:48:32 【问题描述】:

Qt/Qml 使用模型/视图架构 Model/View Programming Model/View Tutorial 但他们的例子太简单了。我想知道它应该如何处理更复杂的问题。假设我们有应用程序。根据 Qt 的模型/视图架构,最好的解决方案是创建 ApplicationModel、ApplicationView 和 ApplicationDelegate。现在让我们的应用程序拥有一个控制台和其他组件。 Console 应该分离为 ConsoleModel、ConsoleView 和 ConsoleDelegate。但是Console有自己的Input和Output,应该分别为ConsoleOutputModel、ConsoleOutputView、ConsoleOutputDelegate和ConsoleInputModel、ConsoleInputView、ConsoleInputDelegate。 但是这一切应该如何结合呢? ApplicationModel 是否应该包含包含 ConsoleOutputModel 和 ConsoleInputModel 的 ConsoleModel?这是有道理的,但是视图和代表呢?同样还是ApplicationDelegate应该控制ConsoleView和ConsoleDelegate?那么 ConsoleOutputView 应该如何访问 ConsoleOutputModel 呢? 对于每一个提示或示例解决方案,我将不胜感激。

【问题讨论】:

在我看来,每个应用程序都是一棵组件树。所以问题是:Qt 的模型/视图架构是否定义了如何处理如此复杂的结构?如果是这样,怎么做?如果没有,就直说吧。 【参考方案1】:

你的暗示大多是不正确的。没有理由嵌套模型,除非您希望在逻辑上组合它们的数据 - 如果是这样,您需要编写一个自定义代理模型来这样做。 Qt 提供的现有代理模型只有一个源模型。这就是那里,做一个多源代理当然是可能的。

在 Qt 的模型视图模型中,委托具有特定的含义:它是用于与项目交互的视觉“皮肤”。它专门派生自 QAbstractItemDelegate 类。委托概念适用于模型中查看的项目,而不适用于整个视图。您可能需要许多代表,而不仅仅是一个,或者根本不需要代表。它与模型-视图-控制器中的委托概念不同。

我看到的另一个问题是要求整个应用程序是ApplicationView。 Qt 不提供使用QAbstractItemModel 作为数据源构建整个应用程序的基于小部件的用户界面的视图。您得到的最接近的是QUiLoader,它可以加载.ui XML 文件并实例化 UI 对象——但这不使用模型视图框架,并且是一次性操作:对底层 XML 模型的任何更改都是不会自动传播。

Qt 中通常使用模型和视图的方式是将模型耦合到一个或多个视图小部件。然后这些小部件以特定方式显示模型的某些子集(可能是完整模型)。您甚至可以使用 QModelWidgetMapper 将模型耦合到任何小部件的属性。

【讨论】:

不欢迎提出这样的问题来表明他们是受欢迎的...... 嗯,有办法或多或少客观地回答它。如您所见,答案主要与 Qt 中可用的内容及其使用方式有关。从这个意义上说,它不是很笼统。

以上是关于嵌套模型/视图架构的主要内容,如果未能解决你的问题,请参考以下文章

knockout.js remove 不适用于主视图模型中的嵌套视图模型和视图模型

Qt 嵌套模型视图

Mvc 列出嵌套在 Viewmodel 中的多个视图

使用视图控制器淘汰嵌套的可观察对象

java中的视图模型(嵌套与否)

MVC Razor 视图嵌套 foreach 的模型