根据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,以检查是否相等.幸运的是,这个函数是虚函数,所以你可以在子类中覆盖它.