2

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を作成しているときに何か間違ったことをしていますか?

また、リストを作成するためにループで作成された QVariants を qDebug() しようとすると、空の値が出力されます。たとえば、コードの最初のチャンクで生成される出力は次のようになります。

QVariant(ReadingDirection, ) 
QVariant(ReadingDirection, )
QVariant(ReadingDirection, )
QVariant(ReadingDirection, )
QVariant(ReadingDirection, )
QVariant(BarcodeStandard, )
QVariant(BarcodeStandard, )
QVariant(BarcodeStandard, )

ご覧のとおり、値が正しく出力されていません...理由を教えてください。

ありがとう、ピエール。

4

1 に答える 1

0

これで問題が解決するかどうかはわかりませんが、カスタムタイプをQVariantとして使用するには、Q_DECLARE_METATYPEMakroを使用する必要があります。ここを参照してください:http://doc.qt.digia.com/qt/qmetatype.html#Q_DECLARE_METATYPE

于 2012-10-23T15:02:36.950 に答える