在QML中,模型角色的名称通常用作strings
但在某些情况下,情况并非如此。一个例子是ListModel.onDataChanged
此处我们有三个参数(请参阅here)topLeft
,bottomRight
和roles
我们可以用来处理信号。虽然您可以轻松地使用topLeft.row
来确定索引,但我发现没有办法有效地评估作为QVector<int>
给出的角色,而对于QML用法,QVector<string>
会有利。更糟糕的是,roleNames
在C ++中可用,返回角色的整数表示的映射到表示角色名称的相应字符串。
幸运的是,我只有有限的角色,所以我 可能 处理它。但是QML给我提供了我极力寻求的信息真的很不错。 ; - )
所以也许你有一个不需要C ++的解决方案(我可能会创建一个ProxyModel然后为我公开roleNames())
答案 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的所有信息。