0

在 QML 中,模型角色的名称通常使用strings.
然而,在某些情况下,情况并非如此。一个例子是ListModel.onDataChanged

这里我们有三个参数(见这里topLeft,我们可以用它们来处理信号bottomRightroles虽然您可以topLeft.row轻松地使用 来确定索引,但我发现无法有效地评估以 a 给出的角色,QVector<int>而对于 QML 的使用 aQVector<string>将是有利的。更糟糕的是,roleNames, 在 C++ 中可用,返回角色的整数表示到表示角色名称的相应字符串的映射。

幸运的是,我的角色数量有限,所以我可能会处理它。但是如果 QML 能给我我如此拼命寻找的信息,那就太好了。;-)

因此,也许您有一个不需要 C++ 的解决方案(我可能会创建一个 ProxyModel,然后为我公开 roleNames())

4

2 回答 2

1

你确定你需要这个,即使用暴露的角色作为 QML 中的属性不符合你的需要吗?如果是这样,您可以通过以下几种方式获取此信息:

  • 模型类本身中的一个插槽(Q_OBJECT也可以添加),例如
public slots:
    QString roleIndexToString(int index) const
    { /* implement */ }
  • 您还可以在模型类中定义一个新信号,将其连接到dataChanged信号并在内部进行转换
signals:
    void dataChangedString(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<QString> &roles = QVector<QString> ()))

// in the class constructor
connect(this, &MyClass::dataChanged,
        [](const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles){
            // Fill string vector and emit dataChangedString
});
于 2017-01-25T09:15:15.930 回答
1

在对 C++ 代码进行了更多研究之后,ListModel我得出结论,如果不访问 C++ 层,这是不可能的。

但是当我计划使用 QMLListModel进行原型设计时,我决定简单地注册一个QIdentityProxyModel-descendant,我通过一种方法对其进行了扩展:

QString ProxyModel::getRoleIntToName(int roleID) const
{
    return (QString)(roleNames()[roleID]);
}

现在,每当我需要访问 QML 模型的 C++ 层时,我都可以将其放入 thisProxyModel中,并检索所有可能隐藏在 QML 中的信息。

于 2017-05-09T11:56:33.537 回答