更新
我创建了一个qt bugticket,希望文档能够得到扩展。
原始问题
Believe an Question from 2010 and the Qt Documentation ,operator==()
不适用于自定义类型。
引用:
bool QVariant::operator==(const QVariant & v) const
将此 QVariant 与它们进行比较,如果它们相等则
v
返回;true
否则返回false
。
QVariant
使用它包含的 type() 的相等运算符来检查相等性。如果其类型与此变体的类型不同,QVariant
将尝试。convert()
v
查看canConvert()
可能的转换列表。警告:此函数不支持使用
qRegisterMetaType()
.
我试图从 2010 年的 Stackoverflow 问题中重现重现案例,并且比较对我来说没有任何问题。
我还更进一步,尝试使用自己的类进行比较,这也很有效。要重现,请将以下代码放入任何标题中:
enum MyEnum { Foo, Bar };
Q_DECLARE_METATYPE(MyEnum)
class MyClass
{
int value;
public:
MyClass() : value(0)
{
}
MyClass(int a) : value(a)
{
}
bool operator==(const MyClass &) const
{
Q_ASSERT(false); // This method seems not to be called
return false;
}
bool operator!=(const MyClass &) const
{
Q_ASSERT(false); // This method seems not to be called
return true;
}
};
Q_DECLARE_METATYPE(MyClass)
并将以下代码放入任何函数中:
QVariant var1 = QVariant::fromValue<MyEnum>(Foo);
QVariant var2 = QVariant::fromValue<MyEnum>(Foo);
Q_ASSERT(var1 == var2); // Succeeds!
var1 = QVariant::fromValue<MyEnum>(Foo);
var2 = QVariant::fromValue<MyEnum>(Bar);
Q_ASSERT(var1 != var2); // Succeeds!
QVariant obj1 = QVariant::fromValue<MyClass>(MyClass(42));
QVariant obj2 = QVariant::fromValue<MyClass>(MyClass(42));
Q_ASSERT(obj1 == obj2); // Succeeds!
obj1 = QVariant::fromValue<MyClass>(MyClass(42));
obj2 = QVariant::fromValue<MyClass>(MyClass(23));
Q_ASSERT(obj1 != obj2); // Succeeds!
我猜想在较新的 qt 版本中,Q_DECLARE_METATYPE
使用 时会获取类型的大小,因此 QVariant 可以按字节比较未知类型的值。
但这只是一个猜测,我不想通过猜测 qt 的功能而不是依赖文档来冒我的应用程序稳定性的风险。
我可以找出 QVariant 如何比较未知类型吗?我宁愿依赖规范而不是实现。