Как поддержать сравнение объектов QVariant, содержащих пользовательский тип?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как поддержать сравнение объектов QVariant, содержащих пользовательский тип?

Сообщение Anonymous »

Согласно документации 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(Foo);
QVariant var2 = QVariant::fromValue(Foo);
assert(var1 == var2); // Fails!
Что мне нужно сделать по-другому, чтобы это утверждение было верным?

Я понимаю, почему оно не работает — каждый вариант хранит отдельную копию перечислимого значения, поэтому у них разные адреса. Я хочу знать, как я могу изменить свой подход к хранению этих значений в вариантах, чтобы либо это не было проблемой, либо чтобы они оба ссылались на одну и ту же базовую переменную.

Я не думаю, что смогу обойти необходимость сравнения на равенство для работы. Контекст таков, что я использую это перечисление в качестве UserData в элементах QComboBox, и я хочу иметь возможность использовать QComboBox::findData для поиска индекса элемента, соответствующего конкретному перечисляемому значению.

Подробнее здесь: https://stackoverflow.com/questions/286 ... ustom-type
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»