Qt枚举比较并输出到QDebug

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

我正在向Qt元对象系统注册枚举。我已经仔细检查了所有这些都有一个元类型ID,并且一切看起来都很完美。但我有一个悬而未决的问题与这些比较

让我们考虑这个代码来填充组合框:

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, )