我有一些模型使用 QAbstractItemModel
规则来为表检索和提供数据。
我的示例模型有多个列和行。不幸的是,QtQuick 小部件只能处理一列。其他“列”通过角色添加到 QtQuick 小部件。因此 View 中的多个列与模型中的同一列匹配。其他模型列将被忽略,如 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 View 不使用 QAbstractItemModel
和 QTableView
已经使用的(行,列)符号?
最佳答案
部分困难在于 QtQuick 使用模型的方式比 QWidget View 更严格,因此值得尝试以相反的方式实现这一点;将模型转换为使用角色,并使用代理模型将角色映射到列索引 + headerData 的方式与 TableViewColumn 相同,但用于 QWidget View 。如果源是静态数量的角色而不是变化的列数量,则列插入和移除信号应该更容易处理。
遗憾的是,这对内置或更复杂的模型没有帮助。
当手机是其设计目标时,大多数 QtQuick View 都是为一维模型设计的。角色用于将单行/项目的无序属性映射到它们的脚本名称。
TableView 出现在几年后,似乎应该做更多的工作来允许使用 2D 模型,但在 QtQuick 已经是一个野兽的时候,它可能需要做一些额外的工作,尤其是因为 TableView 主要是用 QML 本身编写的。
关于c++ - 将现有的(行、列)C++ 模型与 QtQuick(网格、 TableView )一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26329165/