Как поддерживать сравнения для объектов QVariant, содержащих пользовательский тип?
Согласно документации 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
найти индекс предмета, соответствующий конкретному перечисляемому значению.