Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 将整数角色解析为QML中的角色名称_Qt_Qml_Qtquick2_Qt5.7 - Fatal编程技术网

Qt 将整数角色解析为QML中的角色名称

Qt 将整数角色解析为QML中的角色名称,qt,qml,qtquick2,qt5.7,Qt,Qml,Qtquick2,Qt5.7,在QML中,模型角色的名称通常用作字符串 然而,在某些情况下,情况并非如此。例如ListModel.onDataChanged 这里我们有三个参数(请参见)左上、右下和角色,可以用来处理信号。虽然您可以轻松地使用左上角的.row来确定索引,但我发现没有有效的方法来评估角色,这些角色以QVector的形式给出,而对于QML的使用,QVector将是有利的。更糟糕的是, RoNeNase,在C++中可用,将角色的整数表示映射映射到代表角色名称的相应字符串。 幸运的是,我的角色数量有限,所以我可以处理

在QML中,模型角色的名称通常用作
字符串

然而,在某些情况下,情况并非如此。例如
ListModel.onDataChanged

这里我们有三个参数(请参见)
左上
右下
角色
,可以用来处理信号。虽然您可以轻松地使用
左上角的.row
来确定索引,但我发现没有有效的方法来评估角色,这些角色以
QVector
的形式给出,而对于QML的使用,
QVector
将是有利的。更糟糕的是, RoNeNase<代码>,在C++中可用,将角色的整数表示映射映射到代表角色名称的相应字符串。 幸运的是,我的角色数量有限,所以我可以处理它。但如果QML能给我提供我迫切需要的信息,那就太好了。;-)


也许你有一个不需要C++的解决方案(我可能会创建一个PROYE模型,然后为我公开RelaMeX())

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

  • 模型类本身中的一个槽(也添加
    Q_对象
    ),例如
  • 您还可以在模型类中定义一个新信号,将其连接到
    dataChanged
    信号,并在内部进行转换
信号:
void dataChangedString(const QModelIndex&topLeft,const QModelIndex&bottomRight,const QVector&roles=QVector())
//在类构造函数中
连接(此,&MyClass::dataChanged,
[](常量QModelIndex和左上角、常量QModelIndex和右下角、常量QVector和角色){
//填充字符串向量并发出dataChangedString
});

是否确实需要此功能,即在QML中将公开角色用作属性不符合您的需要?如果是这样,您可以通过以下几种方式获得此信息:

  • 模型类本身中的一个槽(也添加
    Q_对象
    ),例如
  • 您还可以在模型类中定义一个新信号,将其连接到
    dataChanged
    信号,并在内部进行转换
信号:
void dataChangedString(const QModelIndex&topLeft,const QModelIndex&bottomRight,const QVector&roles=QVector())
//在类构造函数中
连接(此,&MyClass::dataChanged,
[](常量QModelIndex和左上角、常量QModelIndex和右下角、常量QVector和角色){
//填充字符串向量并发出dataChangedString
});

在进一步研究了
列表模型的C++代码之后,我得出结论,如果不访问C++层,这是不可能的

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

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

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

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

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

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

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

只需使用对象模型,不需要角色,不需要数据更改通知,直接使用具有应报告属性的对象,您可以在不受动态角色惩罚的情况下实现无约束,模型项可以指定要使用的委托。在我的经验中,一个单一的、多用途的、极其有用的C++类是所有需要的,以使您的生活更轻松,您的工作更快,也消除了需要使用一组不完善的组件作为股票的做事方式。您可以嵌套模型,在多个模型中有一个对象,并以声明方式或强制方式填充模型。如果我同时在一个视图中使用它,否则它会崩溃,因为它实际上不是一个
委托
,而是一个简单的列表,没有任何用处,或者至少我不知道。我有时会做的是,为
ListModel
中的每个条目实例化
QtObject
,以便能够获取所有信号。默认情况下,
ListModel
只支持平面模型是一个错误,但是如果你不添加
listmitems
而是添加QtObjects,它们可以嵌套(有一些限制),这对我来说已经够好了。ObjectModel很糟糕,我的意思是这样的:所有权也可以是可选的。@对于通用模型来说,非常需要驱动程序角色和数据更改信号。没有它们,您就无法在
列表视图中使用
部分
,或者您必须为
组合框
重新创建每个代理,而不仅仅是使用
文本角色
,或者您无法在SortFilterProxy模型中真正使用它们。链接的另一种选择是公开属性的角色。但它没有声明性填充功能。只需使用对象模型,不需要角色,不需要数据更改通知,直接使用具有可通知属性的对象,就可以实现无规则性,而不必惩罚动态角色,模型项可以指定要使用的委托。在我的经验中,一个单一的、多用途的、极其有用的C++类是所有需要的,以使您的生活更轻松,您的工作更快,也消除了需要使用一组不完善的组件作为股票的做事方式。你可以嵌套模型,有一个
QString ProxyModel::getRoleIntToName(int roleID) const
{
    return (QString)(roleNames()[roleID]);
}