Qt 枚举比较并输出到 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() 在循环中创建的 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我不确定这是否能解决您的问题,但要使用自定义类型作为 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