【问题标题】:Using an existing (row, column) C++ model with QtQuick (Grid, TableView)将现有的(行、列)C++ 模型与 QtQuick(Grid、TableView)一起使用
【发布时间】:2014-10-12 19:36:29
【问题描述】:

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

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

中所述

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

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

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

【问题讨论】:

    标签: c++ qt qml qtquick2 qabstractitemmodel


    【解决方案1】:

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

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

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

    TableView 是几年后才出现的,它似乎应该加倍努力以允许使用 2D 模型,但在 QtQuick 已经是一头野兽的时候,它可能需要做一些额外的工作,尤其是因为 TableView 主要是用 QML 本身编写的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 2015-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多