Qt枚举比较并输出到QDebug
我正在向Qt元对象系统注册枚举。我已经仔细检查了所有这些都有一个元类型ID,并且一切看起来都很完美。但我有一个悬而未决的问题与这些比较Qt枚举比较并输出到QDebug,qt,enums,comparison,qvariant,qdebug,Qt,Enums,Comparison,Qvariant,Qdebug,我正在向Qt元对象系统注册枚举。我已经仔细检查了所有这些都有一个元类型ID,并且一切看起来都很完美。但我有一个悬而未决的问题与这些比较 让我们考虑这个代码来填充组合框: WgtEnumItemEditor::WgtEnumItemEditor (QVariant::Type t, QWidget *p) : QComboBox(p) { QMetaObject const &mo = staticMetaObject; QString mtName = QMetaType
让我们考虑这个代码来填充组合框:
WgtEnumItemEditor::WgtEnumItemEditor (QVariant::Type t, QWidget *p) : QComboBox(p) {
QMetaObject const &mo = staticMetaObject;
QString mtName = QMetaType::typeName(t);
mtName = mtName.mid( mtName.lastIndexOf(':')+1 );
qint32 const iEnum = mo.indexOfEnumerator( mtName.toLatin1() );
QMetaEnum const &en = mo.enumerator( iEnum );
quint32 const cEnum = en.keyCount();
for (quint32 i=0; i<cEnum; i++){
const char *key = en.key(i);
uint const val = en.value(i);
QVariant const var ( t, &val );
addItem( classNameToNaturalString(key), var );
qDebug() << var;
}
}
这样就行了
有人能告诉我如何在QVariant中启用自定义枚举的比较吗?或者我在创建用作列表用户数据的QVariant时做错了什么
另外,如果我尝试qDebug在循环中创建的QVariants来填充列表,我会得到空值输出。例如,在第一段代码中生成的输出如下所示:
QVariant(ReadingDirection, )
QVariant(ReadingDirection, )
QVariant(ReadingDirection, )
QVariant(ReadingDirection, )
QVariant(ReadingDirection, )
QVariant(BarcodeStandard, )
QVariant(BarcodeStandard, )
QVariant(BarcodeStandard, )
如您所见,值没有正确输出。。。你能帮我找到原因吗
谢谢,,
Pierre。我不确定这是否解决了您的问题,但要使用自定义类型作为QVariant,您需要使用Q_DECLARE_元类型Makro。
请参见此处:我不确定这是否解决了您的问题,但要使用自定义类型作为QVariant,您需要使用Q_DECLARE_元类型Makro。
参见此处:在QVariant const var t中,&val;您正在获取局部变量的地址。我认为你不应该那样做。您是否尝试过QVariant const var t,val;相反那么v.data将是一个整数,而不是实际指向。。。谁知道?!这显然是错误的,原因有二:1这个特定的构造函数为类型获取第一个参数,为指针获取第二个参数,该指针的值随后在内部复制到另一个内部内存位置。QVariant从不直接存储第二个参数所指的地址,而是获取存储在该地址的内容并进行复制。2当使用v.data时,它会给我一个void*,或者当使用constData时,它会给我一个constvoid*。当像这样使用枚举时,这实际上给了我枚举的int值:const int*v.constData,它工作得非常好!澄清一下:我的解决方案是有效的,但不是干净的。此外,我希望有一个解决方案,将正确的值输出到qDebug,同时能够使用携带数据类型和值信息的QVariant;您正在获取局部变量的地址。我认为你不应该那样做。您是否尝试过QVariant const var t,val;相反那么v.data将是一个整数,而不是实际指向。。。谁知道?!这显然是错误的,原因有二:1这个特定的构造函数为类型获取第一个参数,为指针获取第二个参数,该指针的值随后在内部复制到另一个内部内存位置。QVariant从不直接存储第二个参数所指的地址,而是获取存储在该地址的内容并进行复制。2当使用v.data时,它会给我一个void*,或者当使用constData时,它会给我一个constvoid*。当像这样使用枚举时,这实际上给了我枚举的int值:const int*v.constData,它工作得非常好!澄清一下:我的解决方案是有效的,但不是干净的。另外,我希望有一个解决方案,将正确的值输出到qDebug,同时能够使用QVariant携带数据的类型和值信息。
*(uint*)itemData(i).data()==*(uint*)v.data()
QVariant(ReadingDirection, )
QVariant(ReadingDirection, )
QVariant(ReadingDirection, )
QVariant(ReadingDirection, )
QVariant(ReadingDirection, )
QVariant(BarcodeStandard, )
QVariant(BarcodeStandard, )
QVariant(BarcodeStandard, )