使用Qt Model / View与非表格数据和非表格/列表UI?

时间:2012-03-13 15:03:38

标签: c++ model-view-controller qt

我一直在阅读Qt的Model / View框架。我发现使用像数据库中的表这样的表数据非常有用。我的问题是:对于非表格数据,如属性列表或只是一些不同类型的数据,它会有用吗?如果是这样,我该怎么做呢?

目标是为数据等属性列表提供编辑器。该列表在运行时构造,并且元素具有各种类型(数字,字符串,布尔值和文件路径,仅举几例)。每个元素基本上都是一个名称 - 值对。在编译时定义每个元素的名称,类型和约束(例如限制)。根据用户输入,它们将在运行时组装到不同的列表中。在编辑会话期间,元素列表可能会发生变化。

UI很可能是根据用户输入组装的各种预先设计的小部件的组合。它们可能不是列表或表格视图。

一些指向设计模式或示例的指针也非常受欢迎。感谢。

2 个答案:

答案 0 :(得分:3)

我没有看到QT中的MVC框架存在问题。

基本上,标准表显示与此之间的区别在于您动态创建类似于以下地图的列表:

QMap<QString, QVariant> property_map;

你可以做:

QList<std::pair<QString, QVariant>> property_list;

然后您可以使用它在表中显示属性。最好的方法可能是:

struct {
   QString prop_name;
   int prop_type;
   QVariant prop_value;
};

QVariant基本上会为您提供一个用于数据存储的抽象类,它实际上是您可能正在重新实现的data()QAbstractItemModel函数返回的内容。

所以基本上你会拿一个属性列表并将其归结为与数据库相同的表格。

<强>修订

如果您有一个Widget,您希望将此窗口小部件填充其他预定义的窗口小部件,除非窗口小部件具有相同或明确​​定义的大小,否则您很可能会遇到多个问题。

你可以做什么在你的显示小部件中定义一个布局,如:QGridLayout或其他可能的布局,然后使用一些参数将其他小部件添加到它,这可以完成,但可以在某种程度上疼痛

您可以采取的另一种方法是将所有属性小部件放在显示器UI的前面,然后简单地转动您需要的小部件,其余部分关闭,但这仅适用于您有一个明确定义的有限数量的预先设计小部件。

答案 1 :(得分:2)

我一直在使用Model / View框架已经有一段时间了,我通常使用基于Qt容器(向量,列表等)的后端实现自己的模型。即使数据最终来自数据库,使用(例如)数据库ID向量也可以显着提高性能(有时候这是你能做到的唯一方法)。

来自Qt docs的

This trivial example(参见“创建自定义模型”)是我开始的地方,并展示了如何使用QStringList作为自定义模型的后端。

定义模型后,您可以定义自定义视图,这将根据下方模型的内容绘制排列的小部件。 当模型更改时,您的视图将在必要时相应地更改重新排列小部件。 利用QVariant功能,您应该能够为每种数据类型呈现适当的小部件(例如,QSpinBox用于浮点数QComboBox用于QStringList,依此类推......)