Согласно документации Qt, QVariant::operator==
не работает, как можно было бы ожидать, если вариант содержит настраиваемый тип:
bool QVariant :: operator == (const QVariant & v) const
Сравнивает этот QVariant с v и возвращает true, если они равны; в противном случае возвращает false.
В случае нестандартных типов их операторы равенства не вызываются. Вместо этого сравниваются адреса значений.
Как вы должны заставить это вести себя осмысленно для ваших пользовательских типов? В моем случае я сохраняю перечислимое значение в QVariant, например.
В шапке:
enum MyEnum { Foo, Bar };
Q_DECLARE_METATYPE(MyEnum);
Где-то в функции:
QVariant var1 = QVariant::fromValue<MyEnum>(Foo);
QVariant var2 = QVariant::fromValue<MyEnum>(Foo);
assert(var1 == var2); // Fails!
Что мне нужно сделать иначе, чтобы это утверждение было верным?
Я понимаю, почему это не работает - каждый вариант хранит отдельную копию перечисляемого значения, поэтому у них разные адреса. Я хочу знать, как я могу изменить свой подход к хранению этих значений в вариантах, чтобы либо это не было проблемой, либо чтобы они оба ссылались на одну и ту же базовую переменную.
Не думаю, что мне удастся обойтись без сравнения на равенство для работы. Контекст состоит в том, что я использую это перечисление как UserData в элементах в QComboBox
, и я хочу иметь возможность использовать QComboBox::findData
для поиска индекса элемента, соответствующего конкретному перечислимому значению.