2012-03-13 48 views
6

我一直在阅读关于Qt的Model/View框架。我发现它真的有助于处理表格数据,比如来自数据库的表格。我的问题是:对于非表格数据(如属性列表)或是各种类型的数据会有用吗?如果是这样,我应该如何处理它?使用Qt Model/View与非表格类似的数据和非表/列表UI?

目标是想出一个像数据一样的属性列表的编辑器。该列表是在运行时构建的,元素有各种类型(数字,字符串,布尔值和文件路径等等)。每个元素基本上都是一个名称 - 值对。每个元素的名称,类型和限制(例如限制)在编译时定义。根据用户输入,它们将在运行时组装到不同的列表中。在编辑会话期间,元素列表可能会更改。

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

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

回答

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,你可能会被重新实现内。

所以基本上你会拿一个属性列表并将它归结为像数据库一样的数据表。

修正

如果你有,你想拥有这个小部件填充与其他预定义的小工具你很可能有多个问题,除非部件是相同的或明确定义大小的窗口小部件。

你可以做的是在你的显示小部件中定义一个布局,例如:QGridLayout或其他可能的布局,然后使用一些参数将其他小部件添加到它,这可以做,但可能有点痛苦。

您可能采取的另一种方法是将所有属性小部件预先放置在显示屏用户界面上,并简单地将需要的部分和其他部分关闭,但只有在明确限定数量的前置 - 设计的小部件。

+0

感谢你的回答。但我的问题是关于在非表格UI中使用Qt Model View框架。就像在布局中创建和布置的小部件一样。不过,变体是个好主意。 – 2012-03-15 14:41:35

2

我一直在使用模型/视图框架相当长一段时间,我通常实现我自己的模型与后端基于Qt容器(向量,列表等)。即使数据最终来自数据库,使用(例如)数据库ID的矢量也可以显着提高性能(有时是唯一可行的方法)。

This trivial example从Qt的文档(请参阅“创建自定义模型)是我开始并展示了如何使用一个QStringList中作为自定义模型后端点。

一旦定义你的模型,你可以定义自定义意见,这将利用基于下面的模型的内容安排小部件。 当模型的变化,您认为会在必要时改变相应清理小部件。 利用QVariant能力,你应该能够使每一个数据类型正确的窗口小部件(例如,对于浮动一个QComboBox一个QStringList中,等一个QSpinBox ...)

+0

感谢您指出QVariant。但我的问题是关于使用非表数据和UI的框架。对不起,我没有说清楚。 – 2012-03-15 14:43:11

+0

好吧,你需要的是定义你自己的看法,获得由模型/视图框架暴露基类。以QAbstractItemView中的例子:你可以用下面的模型内容根据在滚动区域呈现小部件。 – Masci 2012-03-15 15:02:55

+0

相应地编辑了我的答案 – Masci 2012-03-15 15:11:24