在QML中将Integer-Role解析为RoleName

时间:2017-01-24 14:42:30

标签: qt qml qtquick2 qt5.7

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

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

幸运的是,我只有有限的角色,所以我 可能 处理它。但是QML给我提供了我极力寻求的信息真的很不错。 ; - )

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

2 个答案:

答案 0 :(得分: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
});

答案 1 :(得分:0)

经过对C ++的更多研究 - ListModel的代码我得出结论,如果没有访问C ++ - Layer就不可能。

但是当我计划使用QML ListModel进行原型设计时,我决定只注册一个QIdentityProxyModel - 后代,我通过一种方法进行扩展:

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

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