使用具有QtQuick(网格、表格视图)的现有(行、列)C++模型

Using an existing (row, column) C++ model with QtQuick (Grid, TableView)

本文关键字:模型 C++ 表格 QtQuick 网格 视图      更新时间:2023-10-16

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

我的示例模型有多列和多行。不幸的是,QtQuick小部件只能处理一列。其他"列"通过角色的方式添加到QtQuick小部件中。因此,视图中的多个列与模型中的同一列匹配。其他模型列被忽略,如本问题及其答案中所述

我认为,为QML提供一个抽象应该不会太难,以便在C++端使用(作为QAbstractProxyModel),当被问及行N时,它会用源模型的列计数对其进行模运算,并从生成的实际列中检索数据。这似乎对Grid有效,但对TableView无效,因为它依赖于TableViewColumn和角色名称,而不是仅使用连续行索引。为此,代理模型需要通过角色来区分要从源模型的哪一列检索。

的答案中出现的片段http://qt-project.org/forums/viewthread/41793这样做是为了使用QSqlTableModel,但仍然没有将许多信号转换为可用信号。就像我想象的那样,如果SQL源模型会发出columnsInserted,那么它应该转换为信号dataChanged,其中为该列选择了新角色,并更改了可用的角色名称。QMLifyProxyModel看起来更好,但似乎还没有做好生产准备,而且已经死了4年。

根据官方建议,我们如何才能最好地解决这个问题,使两个世界能够流畅地合作?为什么QtQuick视图不使用QAbstractItemModelQTableView已经使用的(行、列)表示法?

部分困难在于QtQuick使用模型的方式比QWidget视图更严格,因此值得尝试用另一种方式来实现这一点;将模型转换为使用角色,并使用代理模型将角色映射到列索引+headerData,方法与TableViewColumn相同,但适用于QWidget视图。如果源是静态数量的角色而不是不断变化的列,那么列插入和删除信号应该更容易处理。

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

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

TableView是几年后出现的,它似乎应该为使用2D模型做更多的工作,但在QtQuick已经相当庞大的时候,这可能是一项额外的工作,尤其是因为TableView主要是用QML本身编写的。