更新
我已经创建了qt bugticket希望文档将被扩展。与自己类型的QVariant比较工作?
原始的问题
相信一个Question from 2010和Qt Documentation,该operator==()
不与自定义类型的工作。
引用:
布尔的QVariant ::运算符==(常量的QVariant & v)的常量
比较此的QVariant与
v
并返回true
它们是否相等;否则返回false
。
QVariant
使用它包含的类型()的相等运算符来检查相等性。QVariant
将尝试convert()
v
如果它的类型与此变体的类型不同。有关可能的转换列表,请参阅canConvert()
。警告:此功能不支持使用
qRegisterMetaType()
注册的自定义类型。
我试图重现从Stackoverflow Question from 2010 repro案件和比较工作对我没有任何问题。
我也走得更远,并尝试使用自己的类也完美比较比较。 要重现,把下面的代码到任何标题:
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如何比较未知类型?我宁愿依靠规范而不是执行。
你叫'qRegisterMetaType()''上和MyEnum''MyClass'? – Zaiborg
不,我没有调用'qRegisterMetaType()'。 除了我上面发布的代码外,没有使用MyClass或MyEnum的代码行。 –
您是否试图将这些值转换回其原始类型比较? ('QVariant :: value()')也是什么例如'var1'的类型? (或者要清楚,变量是什么类型,它说的是什么类型) –
Zaiborg