首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在异构数据层次结构的不同视图之间进行拖放

在异构数据层次结构的不同视图之间进行拖放
EN

Stack Overflow用户
提问于 2013-04-16 19:35:18
回答 1查看 762关注 0票数 2

我有一个分层的数据结构,它将在几个Qt视图(或窗口小部件)中可视化。数据层次结构由不同的元素类型组成,例如:

代码语言:javascript
复制
House
 |- Floor
 |   |- Room
 |   |   |- Window
 |   |   |- ...
 |   |- Room
 |   |   |- ...
 |- ...

所有元素(房屋、楼层、房间...)具有可以显示的属性。请注意,这是一个简化的示例。层次结构由不同的视图绘制。例如,仅模板列表(QListView/Widget)中的房间标识符、自定义视图(每个元素的QWidget子类的层次结构)、用于编辑楼层属性的详细视图(QWidget子类或QWizard)。

还可以在多个实例之间拖放元素。例如,将房间移到不同的楼层。可以将特定楼层声明为模板,并从模板列表中拖动楼层,例如,在自定义视图中(在其中构成房屋)。

Qt使用Model/View architecture来分离数据、模型和视图。因为我有完全不同类型的视图,所以我假设每个视图都需要一个相应的模型。在我的自定义层次视图中,每个元素都有自己的可视化,因此层次结构存在(但不应该存在)三次:数据层次结构、模型层次结构和视图层次结构。这会变得非常混乱,因为如果一个元素被拖放、删除或复制,每个层次结构都必须更新。更好的方法是Presentation-Abstraction-Control模式。但是,PAC不适用,因为必须设置QWidget的父级才能在父视图中嵌入子视图。因此,QWidget不能引用负责对层次结构建模的代理。

在我看来,Qt在表示同构数据类型(如字符串)的列表、表和树方面非常好。在我的例子中,每个元素都有一组单独的属性,这些属性不能简单地以表的形式表示。在这个discussion中,不鼓励将方形的钉子强行插入圆孔中。这意味着,不强制在表表示中进行任何设计。

我的问题的核心是将以下功能统一到一个设计概念中:具有不同细节级别的分层数据的可视化。支持视图之间的拖放,可复制数据并生成适当的模型/视图组件。支持在视图中拖放,这会影响数据、模型和视图层次结构(我希望避免三次实现)。我不能提供一个模型的房子及其所有子组件,因为楼层和房间太复杂了。我发现对于一个拖放、删除或复制操作来管理三个(或更多)层次结构是很笨拙的。

对于我的问题,有没有最佳实践、设计模式或不同的方法?这个问题可以用Qt解决吗?

我很感谢你的每一个建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-17 00:28:55

在我的层次结构中,有一段时间我遇到了类似的问题。Qt的模型-视图-代理架构中的一切都取决于您如何组织您的数据以及您愿意获得的复杂程度。对于非常简单的应用程序,从基于项目的方法实现内容是有意义的,即在视图级别编辑项目显示。这很快就会变得非常混乱。

听起来您很愿意变得相当复杂,所以我建议您采用基于模型的方法。您可以在模型级别控制几乎所有内容,包括一些基本的显示元素、数据组织和(最重要的)层次结构。

在开始让我的对象继承QStandardItem并子类化QStandardItemModel时,我发现这很有帮助,因为QStandardItem已经为我设置了父子层次结构和索引。我喜欢递增Qt::UserRole并为每个自定义数据类型分配一个enum值。例如:

代码语言:javascript
复制
enum FloorProperties
{
    DAT_CARPETING = Qt::UserRole +100,
    DAT_AREA = Qt::UserRole +101,
    DAT_FLOORNUM = Qt::UserRole +102
}

即使您不想将存储值与每个数据角色相关联(使用方便的QStandardItem::setData()),也可以自定义QStandardItemModel::data()以返回计算值、存储值等等。自定义模型允许您将每个项目视为对象,而不是表/列表中的单个单元格。

一般情况下,标准视图应该能提供您所需的大部分内容。使用委托自定义某些数据类型(Floor、Windows、整数、字符串等)的显示。希望这能说得通。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16035969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档