嵌套模型/视图体系结构

Nested model/view architecture

本文关键字:体系结构 视图 模型 嵌套      更新时间:2023-10-16

Qt/Qml使用模型/视图架构模型/视图编程模型/视图教程,但他们的例子太简单了。我想知道它在更复杂的问题中应该是什么样子。假设我们有Application。根据Qt的模型/视图架构,最好的解决方案是创建ApplicationModel, ApplicationView和ApplicationDelegate。现在让我们的应用程序拥有一个控制台和其他组件。控制台应该被分成ConsoleModel, ConsoleView和ConsoleDelegate。但是控制台有自己的输入和输出,应该分开到控制台输出模型,控制台输出视图,控制台输出代表和控制台输入模型,控制台输入视图,控制台输入代表。
但这一切应该如何结合起来呢?ApplicationModel应该包含包含ConsoleOutputModel和ConsoleInputModel的ConsoleModel吗?这是有道理的,但是视图和委托呢?类似的还是ApplicationDelegate应该控制ConsoleView和ConsoleDelegate?那么ConsoleOutputModel应该如何被ConsoleOutputView访问呢?
我将非常感谢每一个提示或示例解决方案。

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

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

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

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