c++ - 将现有的(行、列)C++ 模型与 QtQuick(网格、 TableView )一起使用

标签 c++ qt qml qtquick2 qabstractitemmodel

我有一些模型使用 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 不使用 QAbstractItemModelQTableView 已经使用的(行,列)符号?

最佳答案

部分困难在于 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/

相关文章:

c++ - Wireshark插件: Dissecting Payloads With Multiple Packets Per UDP Frame

用于g++的C++名称修饰解码器?

c++ - 控制和分析内存和时间消耗 C++ Windows 应用程序?

android - 没有适用于 Android 的 Qt 控件样式吗?

qt - QML:子属性的别名

qt - 如何设置 QML 小部件的最小尺寸?

c++ - #include 位于不同目录结构中的头文件

c++ - Qt QProcess怎么写到standard中?

c++ - Qt中的实时保存

c++ - 来自原始指针的 QSharedPointer