Qt枚举QDebug的比较和输出

时间:2011-08-07 16:34:25

标签: qt enums comparison qvariant qdebug

我正在向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本身包含枚举值:

void WgtEnumItemEditor::setValue (const QVariant &v) {
    for (quint32 i=0; i<count(); i++) {
        if (itemData(i)==v.data) {
            setCurrentIndex(i);
            break;
        }
    }
}

这段代码不起作用。我必须通过以下方式替换测试:

*(uint*)itemData(i).data()==*(uint*)v.data()

这种方式有效。

有人可以解释一下如何在QVariants中启用我的自定义枚举的比较吗?或者我在创建用作列表的用户数据的QVariant时做错了什么?

另外,如果我尝试qDebug()在循环中创建的QVariant用于填充列表,我得到空值输出。例如,第一块代码中生成的输出如下所示:

QVariant(ReadingDirection, ) 
QVariant(ReadingDirection, )
QVariant(ReadingDirection, )
QVariant(ReadingDirection, )
QVariant(ReadingDirection, )
QVariant(BarcodeStandard, )
QVariant(BarcodeStandard, )
QVariant(BarcodeStandard, )

正如你所看到的,价值没有正确地输出......你能帮我找到原因吗?

谢谢你, 皮尔。

1 个答案:

答案 0 :(得分:0)

我不确定这是否解决了您的问题,但要将自定义类型用作QVariant,您需要使用Q_DECLARE_METATYPE Makro。 见这里:http://doc.qt.digia.com/qt/qmetatype.html#Q_DECLARE_METATYPE