Согласно документации 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
, чтобы найти индекс элемента, соответствующий конкретному перечисляемому значению.