Qt 枚举比较并输出到 QDebug

发布于 2024-11-28 05:35:53 字数 1675 浏览 6 评论 0原文

我正在将枚举注册到 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() 在循环中创建的 QVariants 来填充列表,我会得到空值输出。例如,第一块代码中生成的输出如下所示:

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

正如您所看到的,该值未正确输出...您能帮我找出原因吗?

谢谢你, 皮埃尔.

i am registering enums to the Qt meta-object system. i have double checked that all of those have a meta-type ID, and everything looks perfect. But i have some kind of unresolved issue with the comparison of those.

Let's consider this code for populating a combobox:

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;
    }
}

It works good, my list gets populated with human readable texts for my enums.

Now, i'm trying to set the initial value displayed by the list with a QVariant itself containing a value for the enum:

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

This piece of code doesn't work. i have to replace the test by:

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

This way it works.

Can anyone explain me how to enable comparison of my custom enums in QVariants? Or am i doing something wrong while creating the QVariant being used as userdata for the list maybe?

Also, if i try to qDebug() the QVariants created in loop for populating the list, i get empty values outputs. For instance, the output generated in the first chunk of code looks like this:

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

As you can see, the value isn't outputed correctly... Can you please help me find why?

Thank you,
Pierre.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

空城之時有危險 2024-12-05 05:35:53

我不确定这是否能解决您的问题,但要使用自定义类型作为 QVariant,您需要使用 Q_DECLARE_METATYPE Makro。
请参阅此处:http://doc.qt.digia.com/qt/qmetatype。 html#Q_DECLARE_METATYPE

I am not sure if this solves your Problem, but to use a custom type as QVariant you need to use the Q_DECLARE_METATYPE Makro.
See here: http://doc.qt.digia.com/qt/qmetatype.html#Q_DECLARE_METATYPE

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文