使用现有的(行,列)C ++模型和QtQuick(Grid,TableView)

时间:2014-10-12 19:36:30

标签: c++ qt qml qtquick2 qabstractitemmodel

我有一些模型使用QAbstractItemModel规则来检索和提供表的数据。

我的示例模型有多个列和行。不幸的是,QtQuick小部件只能处理一个列。其他"列"通过角色添加到QtQuick小部件。因此视图中的多个列与模型中的同一列匹配。其他模型列将被忽略,如this question and its answer

中所述

我在想,为C ++提供一个抽象的QML(作为QAbstractProxyModel)应该不会太困难,当要求行N时,按照列的计数对其进行模数化源模型并从生成的实际列中检索数据。这似乎适用于Grid,但不会对TableView起作用,因为它依赖于TableViewColumn和角色名称而不是仅使用连续行索引。为此,代理模型需要区分源模型的哪个列要从中检索。

http://qt-project.org/forums/viewthread/41793答案中的代码片段用于采用QSqlTableModel,但仍然错过了将大量信号转换为可用的信息。就像我想象的那样,如果SQL源模型会发出columnsInserted,它应该转换为信号dataChanged,并为该列选择新角色并更改可用角色名称。 QMLifyProxyModel似乎更好,但现在看来还没有生产准备就绪并已经死了4年。

根据官方建议,我们如何才能最好地解决这个问题,以便两个世界能够流畅地协同工作?为什么不让QtQuick视图使用QAbstractItemModelQTableView已经使用的(行,列)符号?

1 个答案:

答案 0 :(得分:1)

部分困难在于QtQuick使用模型的方式比QWidget视图更严格,所以可能值得尝试以相反的方式实现这一点;将模型转换为使用角色并使用代理模型将角色映射到列索引+ headerData的方式与TableViewColumn相同,但是对于QWidget视图。如果源是静态角色数而不是更改列数,则列插入和删除信号应该更容易处理。

可悲的是,这对内置或更复杂的模型没有帮助。

当手机成为其设计目标时,大多数QtQuick视图都是针对一维型号设计的。角色用于将单个行/项的无序属性映射到其脚本名称。

TableView几年之后出现了,似乎是应该在允许使用2D模型方面付出额外努力的那一部分,但在QtQuick已经是一头野兽的时候,它可能已经做了一些额外的工作,尤其是因为TableView主要是用QML编写的。