更新
我已經創建了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