如何支持包含自定义类型的QVariant对象的比较?

Tyl*_*nry 22 c++ qt qvariant

根据Qt文档,QVariant::operator==如果变体包含自定义类型,则无法正常工作:

bool QVariant :: operator ==(const QVariant&v)const

将此QVariant与v进行比较,如果它们相等则返回true; 否则返回false.

在自定义类型的情况下,不调用它们的相等运算符.而是比较值的地址.

你怎么能让这个为你的自定义类型表现得有意义?在我的例子中,我将枚举值存储在QVariant中,例如

在标题中:

enum MyEnum { Foo, Bar };

Q_DECLARE_METATYPE(MyEnum);
Run Code Online (Sandbox Code Playgroud)

功能中的某个地方:

QVariant var1 = QVariant::fromValue<MyEnum>(Foo);
QVariant var2 = QVariant::fromValue<MyEnum>(Foo);
assert(var1 == var2); // Fails!
Run Code Online (Sandbox Code Playgroud)

为了使这个断言成为现实,我需要做些什么呢?

我理解为什么它不起作用 - 每个变体都存储枚举值的单独副本,因此它们具有不同的地址.我想知道如何改变我在变体中存储这些值的方法,以便这不是一个问题,或者它们都引用相同的底层变量.

它不认为我可以绕过需要平等比较才能工作.上下文是我使用此枚举作为a中项目的UserData QComboBox,我希望能够QComboBox::findData用于定位与特定枚举值对应的项索引.

Ada*_*m W 15

显而易见的答案是将数据转换var1.value<MyEnum>() == var2.value<MyEnum>()为比较它们,但这需要您在比较时知道类型.在您的情况下,这似乎是可能的.

如果您只是使用枚举,您还可以将其转换为int以存储在QVariant中.

编辑:有关搜索a的说明QComboBox,它使用组合框的模型来查找数据.具体来说,它使用match()的功能QAbstractItemModel,以检查是否相等.幸运的是,这个函数是虚函数,所以你可以在子类中覆盖它.

  • 工作得很好!我将`QStandardItemModel`子类化为类型为`T`的模板,并重新实现`match`,这样如果搜索完全匹配并且要查找的变量可转换为`T`,则`match`方法将比较变体的`.value <T>()`而不是变体本身.谢谢! (3认同)
  • 显而易见的答案不起作用,因为我无法改变`QComboBox`在`findData`方法中的作用.是的,我知道我可以将它存储为int,但这似乎不够优雅.另外,虽然我现在正在使用枚举,但我可能希望以后以相同的方式使用类,所以我正在寻找一个通用的解决方案. (2认同)
  • 然后你可以在模型类中覆盖`match()`函数(http://doc.qt.nokia.com/4.6/qabstractitemmodel.html#match)并将其分配给`QComboBox`,因为它是这样的`findData`编辑的比较:见:http://qt.gitorious.org/qt/qt/blobs/4.7/src/gui/widgets/qcombobox.cpp#line1490 (2认同)
  • 很高兴它有所帮助,不久前我意识到QComboBox可以引用QAbstractItemModel,它使许多接口更容易! (2认同)