Qtメタオブジェクトシステムに列挙型を登録しています。私はそれらのすべてがメタタイプIDを持っていることを二重チェックし、すべてが完璧に見えます。しかし、私はそれらの比較でいくつかの種類の未解決の問題があります。Qtは比較を行い、QDebugに出力します。
はのは、コンボボックスを移入するためのコードを考えてみましょう:それは良い作品
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()にQVariantをループで作成してリストを作成しようとすると、空の値の出力が得られます。例えば、コードの最初のチャンクに生成される出力は次のようになります。
QVariant(ReadingDirection,)
QVariant(ReadingDirection,)
QVariant(ReadingDirection,)
QVariant(ReadingDirection,)
QVariant(ReadingDirection,)
QVariant(BarcodeStandard,)
QVariant(BarcodeStandard,)
QVariant(BarcodeStandard,)
あなたが見ることができるように、値が正しくoutputedされていない...あなたは私がなぜ見つける助けてくださいことはできますか?
ありがとう、 ピエール。
'ローカル変数のアドレスを取っている私は、あなたがそれを行う必要はないと思うあなたは) 'QVariantののconst VAR(トン、ヴァルを試してみました。 ;) '代わりに?次にv.data()は整数であり、ポインタではありません(実際には誰が知っていますか?) –
これは明らかに2つの理由から間違っています:1)この特定のコンストラクタは、型と、* value *が内部的に別の内部メモリの場所にコピーされるポインタのための秒です。 QVariantは、第2パラメータが指すアドレスを決して直接格納することはなく、このアドレスに格納されているものを取り込み、それをコピーします。 2)v.data()を使用すると、void *を与えています(またはconstDataを使用する場合はconst void *)。実際には、このように使用すると、enumのint値が得られます。*(const int *)* v.constData() – Doodloo
わかりやすく:私の解決策は機能していますが、きれいではありません。また、qDebug()に正しい値を出力し、データの型と値の情報を持つQVariantを使用できるソリューションを用意したいと思います。 – Doodloo