Qt перечисляет сравнения и выводит в QDebug - PullRequest
2 голосов
/ 07 августа 2011

Я регистрирую перечисления в мета-объектной системе 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, )

Как вы можете видеть, значение выводится неправильно ... Не могли бы вы помочь мне выяснить, почему?

Спасибо, Пьер.

1 Ответ

0 голосов
/ 23 октября 2012

Я не уверен, что это решит вашу проблему, но чтобы использовать пользовательский тип в качестве QVariant, вам нужно использовать Q_DECLARE_METATYPE Makro.Смотрите здесь: http://doc.qt.digia.com/qt/qmetatype.html#Q_DECLARE_METATYPE

...