使用具有QtQuick(网格、表格视图)的现有(行、列)C++模型
Using an existing (row, column) C++ model with QtQuick (Grid, TableView)
我有一些模型使用QAbstractItemModel
规则来检索和提供表的数据。
我的示例模型有多列和多行。不幸的是,QtQuick小部件只能处理一列。其他"列"通过角色的方式添加到QtQuick小部件中。因此,视图中的多个列与模型中的同一列匹配。其他模型列被忽略,如本问题及其答案中所述
我认为,为QML提供一个抽象应该不会太难,以便在C++端使用(作为QAbstractProxyModel
),当被问及行N时,它会用源模型的列计数对其进行模运算,并从生成的实际列中检索数据。这似乎对Grid
有效,但对TableView
无效,因为它依赖于TableViewColumn
和角色名称,而不是仅使用连续行索引。为此,代理模型需要通过角色来区分要从源模型的哪一列检索。
的答案中出现的片段http://qt-project.org/forums/viewthread/41793这样做是为了使用QSqlTableModel
,但仍然没有将许多信号转换为可用信号。就像我想象的那样,如果SQL源模型会发出columnsInserted
,那么它应该转换为信号dataChanged
,其中为该列选择了新角色,并更改了可用的角色名称。QMLifyProxyModel看起来更好,但似乎还没有做好生产准备,而且已经死了4年。
根据官方建议,我们如何才能最好地解决这个问题,使两个世界能够流畅地合作?为什么QtQuick视图不使用QAbstractItemModel
和QTableView
已经使用的(行、列)表示法?
部分困难在于QtQuick使用模型的方式比QWidget视图更严格,因此值得尝试用另一种方式来实现这一点;将模型转换为使用角色,并使用代理模型将角色映射到列索引+headerData,方法与TableViewColumn相同,但适用于QWidget视图。如果源是静态数量的角色而不是不断变化的列,那么列插入和删除信号应该更容易处理。
遗憾的是,这对内置或更复杂的模型没有帮助。
大多数QtQuick视图都是为1D型号设计的,当时手机是其设计目标。角色用于将单行/项的无序属性映射到其脚本名称。
TableView是几年后出现的,它似乎应该为使用2D模型做更多的工作,但在QtQuick已经相当庞大的时候,这可能是一项额外的工作,尤其是因为TableView主要是用QML本身编写的。
- QTableView:endMoveRows在模型中重置水平页眉大小
- 将IBM Rhapsody模型集成到VS 2019中
- 旋转模型矩阵时的形状失真
- 成员函数调用和C++对象模型
- 连接 dockerized 模型和 dockerized 数据库时出现"无法 SQLConnect"错误
- 打印 ONNXRUNTIME::图形没有模型
- C++内存模型和位字段的最大序列
- 使用SIR模型的疾病爆发模拟
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 如何在 ECS 模型中组织实体?
- 在官方张量流 resnet50 模型上运行 tflite 精度工具
- Libtorch:如何加载ONNX模型?
- 使用 assimp 加载模型 - 不需要提升?
- 如何将经过训练的机器学习模型保存在python中并将其加载到C++中进行预测?
- C++内存模型中的确切规则阻止在获取操作之前重新排序
- 如何更改古罗比C++模型中的目标值系数
- 如何在 openGL 中围绕全局轴旋转模型?
- 我们可以将阈值应用于色彩空间模型的单个组件(如 RGB 和 LAB)吗?
- ASIMP 模型加载不会加载所有网格
- 平方模型为零,阶乘模型问题