【问题标题】:Qt enums comparison and output to QDebugQt枚举比较并输出到QDebug
【发布时间】:2011-10-21 21:23:46
【问题描述】:

我正在向 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, )

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

谢谢你, 皮埃尔。

【问题讨论】:

  • QVariant const var (t, &amp;val); 中,您正在获取局部变量的地址。我认为你不应该那样做。您是否尝试过QVariant const var (t, val);?那么 v.data() 将是一个整数而不是一个指针(它实际上指向......谁知道?!)
  • 这显然是错误的,原因有两个: 1) 这个特定的构造函数接受类型的第一个参数,第二个用于指针,然后 value 在内部复制到另一个内部存储器位置。 QVariant 从不直接存储第二个参数指向的地址,而是获取存储在该地址的内容并复制它。 2) 当然后使用 v.data() 时,它给了我一个 void*(或者当使用 constData 时,一个 const void*)。当像这样使用它时,这实际上给了我枚举的 int 值:(const int)*v.constData(),它工作得很好!
  • 只是为了澄清:我的解决方案有效,但不干净。另外,我想要一个解决方案,将正确的值输出到 qDebug(),同时能够使用 QVariant 携带我的数据的类型和值信息。

标签: qt enums comparison qvariant qdebug


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-05-04
    • 1970-01-01
    • 2023-03-09
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多