嵌套模型/视图架构

时间:2014-07-18 12:48:32

标签: c++ qt view model delegates

Qt / Qml使用模型/视图架构Model/View Programming Model/View Tutorial,但它们的示例过于简单。我想知道它应该如何看待更复杂的问题。假设我们有应用程序。根据Qt的模型/视图架构,最好的解决方案是创建ApplicationModel,ApplicationView和ApplicationDelegate。现在让我们的应用程序拥有一个控制台和其他组件。控制台应分为ConsoleModel,ConsoleView和ConsoleDelegate。但是Console有自己的输入和输出,应分为ConsoleOutputModel,ConsoleOutputView,ConsoleOutputDelegate和ConsoleInputModel,ConsoleInputView,ConsoleInputDelegate。 但这一切应该如何组合? ApplicationModel是否应包含ConsoleOutputModel和ConsoleInputModel的ConsoleModel?这是有道理的,但观点和代表呢?同样或ApplicationDelegate应该控制ConsoleView和ConsoleDelegate? ConsoleOutputView应该如何接受ConsoleOutputModel?
我会非常感谢每一个提示或示例解决方案。

1 个答案:

答案 0 :(得分:2)

你所暗示的大多是不正确的。除非您希望逻辑地组合他们的数据,否则没有理由嵌套模型 - 如果是这样,您需要编写自定义代理模型来执行此操作。 Qt提供的现有代理模型只有一个源模型。这就是那里的事情,做多源代理肯定是可能的。

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

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

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