Я регистрирую перечисления в мета-объектной системе Qt.Я дважды проверил, что все они имеют идентификатор мета-типа, и все выглядит идеально.Но у меня есть какая-то нерешенная проблема с их сравнением.
Давайте рассмотрим этот код для заполнения поля со списком:
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, )
Как вы можете видеть, значение выводится неправильно ... Не могли бы вы помочь мне выяснить, почему?
Спасибо, Пьер.