我正在向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本身包含enum的值:
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()
就是这样。
谁能解释我如何启用比较我的自定义枚举在qvariant ?或者我在创建QVariant被用作列表的用户数据时做错了什么?
另外,如果我尝试qDebug()在循环中创建的用于填充列表的qvariables,我将得到空值输出。例如,在第一个代码块中生成的输出如下所示:
QVariant(ReadingDirection, )
QVariant(ReadingDirection, )
QVariant(ReadingDirection, )
QVariant(ReadingDirection, )
QVariant(ReadingDirection, )
QVariant(BarcodeStandard, )
QVariant(BarcodeStandard, )
QVariant(BarcodeStandard, )
如您所见,值没有正确输出…你能帮我找出原因吗?
谢谢你,皮埃尔。
我不确定这是否解决了您的问题,但是要使用自定义类型作为QVariant,您需要使用Q_DECLARE_METATYPE Makro。详见:http://doc.qt.digia.com/qt/qmetatype.html#Q_DECLARE_METATYPE