C++ 使用具有非表数据和非表/列表UI的Qt模型/视图?

C++ 使用具有非表数据和非表/列表UI的Qt模型/视图?,c++,model-view-controller,qt,C++,Model View Controller,Qt,我一直在阅读有关Qt的模型/视图框架的文章。我发现它对处理像数据库中的表这样的表格数据非常有用。我的问题是:它对属性列表之类的非表数据有用吗,还是只对一些不同类型的数据有用?如果是,我应该如何处理 目标是为一些属性列表(如数据)提供一个编辑器。列表是在运行时构建的,元素有各种类型(数字、字符串、布尔值和文件路径等等)。每个元素基本上是一个名称-值对。每个元素的名称、类型和限制(例如限制)在编译时定义。它们将在运行时根据用户输入组合成不同的列表。并且元素列表可以在编辑会话期间更改 UI很可能是根据

我一直在阅读有关Qt的模型/视图框架的文章。我发现它对处理像数据库中的表这样的表格数据非常有用。我的问题是:它对属性列表之类的非表数据有用吗,还是只对一些不同类型的数据有用?如果是,我应该如何处理

目标是为一些属性列表(如数据)提供一个编辑器。列表是在运行时构建的,元素有各种类型(数字、字符串、布尔值和文件路径等等)。每个元素基本上是一个名称-值对。每个元素的名称、类型和限制(例如限制)在编译时定义。它们将在运行时根据用户输入组合成不同的列表。并且元素列表可以在编辑会话期间更改

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


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

我认为QT中的MVC框架没有问题

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

QMap<QString, QVariant> property_map;
基本上将为您提供一个用于数据存储的抽象类,它实际上是您可能要重新实现的
qabstractemmodel
中的
data()
函数返回的内容

因此,基本上,您将获取一个属性列表,并将其归结为与数据库相同的类似于表的数据

修改后的

如果你有一个小部件,你想让这个小部件填充其他预定义的小部件,你很可能有多个问题,除非小部件大小相同或定义良好

您可以做的是在您的显示窗口小部件中定义一个布局,如:或其他可能的布局,然后使用一些参数集将您的其他窗口小部件添加到其中,这是可以完成的,但可能有点麻烦


您可能采取的另一种方法是将所有属性小部件放在显示UI的前面,只需打开和关闭所需的小部件,但这只适用于定义了有限数量的预先设计的小部件的情况。

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

从Qt文档(请参阅“创建自定义模型”)开始,我介绍了如何使用QStringList作为自定义模型的后端

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

谢谢你的回答。但是我的问题是关于使用Qt模型视图框架和非表UI。就像在布局中创建和排列的小部件一样。尽管变量是个好主意。谢谢你指出QVariant。但是我的问题是关于使用非表数据和UI的框架。很抱歉,我没有说清楚。好的,你需要的是定义你的视图n个视图,派生模型/视图框架公开的基类。以QAbstractItemView为例:您可以根据下面的模型内容在滚动区域中呈现小部件。
QList<std::pair<QString, QVariant>> property_list;
struct {
   QString prop_name;
   int prop_type;
   QVariant prop_value;
};