Qt のドキュメントによるとQVariant::operator==
、バリアントにカスタム タイプが含まれていると、期待どおりに動作しません。
bool QVariant::operator== ( const QVariant & v ) const
この QVariant を v と比較し、等しい場合は true を返します。それ以外の場合は false を返します。
カスタム型の場合、等値演算子は呼び出されません。代わりに、値のアドレスが比較されます。
カスタムタイプに対してこれを有意義に動作させるにはどうすればよいですか? 私の場合、列挙値を QVariant に格納しています。
ヘッダーで:
enum MyEnum { Foo, Bar };
Q_DECLARE_METATYPE(MyEnum);
関数のどこかで:
QVariant var1 = QVariant::fromValue<MyEnum>(Foo);
QVariant var2 = QVariant::fromValue<MyEnum>(Foo);
assert(var1 == var2); // Fails!
この主張が真実であるためには、どうすればよいでしょうか?
機能しない理由を理解しています。各バリアントは列挙値の個別のコピーを保存しているため、異なるアドレスを持っています。これらの値をバリアントに格納するアプローチを変更して、これが問題にならないようにするか、両方が同じ基になる変数を参照するようにする方法を知りたいです。
同等の比較が機能する必要があることを回避することは不可能だと思います。コンテキストは、この列挙を の項目の UserData として使用しており、特定の列挙値に対応する項目インデックスを見つけるためQComboBox
に使用できるようにしたいということです。QComboBox::findData