Я создал багтикет qt в надежде, что документация будет расширена.
Оригинальный вопрос< /h1>
Полагаясь на вопрос 2010 года и документацию Qt, оператор ==() не работает с пользовательскими типами.
Цитата:
bool QVariant::operator==(const QVariant & v) const
Сравнивает этот QVariant с v и возвращает true, если они равны; в противном случае возвращается false.
Код: Выделить всё
QVariant
Внимание: Эта функция не поддерживает пользовательские типы, зарегистрированные с помощью qRegisterMetaType. ().
Я пытался воспроизвести случай воспроизведения из вопроса Stackoverflow от 2010 года, и сравнение сработало без какие-то проблемы для меня.
Я также пошел еще дальше и попробовал сравнения с использованием собственного класса, который также работал отлично.
Чтобы воспроизвести, поместите следующий код в любой заголовок:
Код: Выделить всё
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(Foo);
QVariant var2 = QVariant::fromValue(Foo);
Q_ASSERT(var1 == var2); // Succeeds!
var1 = QVariant::fromValue(Foo);
var2 = QVariant::fromValue(Bar);
Q_ASSERT(var1 != var2); // Succeeds!
QVariant obj1 = QVariant::fromValue(MyClass(42));
QVariant obj2 = QVariant::fromValue(MyClass(42));
Q_ASSERT(obj1 == obj2); // Succeeds!
obj1 = QVariant::fromValue(MyClass(42));
obj2 = QVariant::fromValue(MyClass(23));
Q_ASSERT(obj1 != obj2); // Succeeds!
Но это всего лишь предположение, и я не хочу рисковать стабильностью своего приложения, угадывая, что делает qt, вместо того, чтобы полагаться на документацию.
Могу ли я узнать, как QVariant сравнивает неизвестные типы? Я бы предпочел полагаться на спецификацию, а не на реализацию.
Подробнее здесь: https://stackoverflow.com/questions/197 ... es-working