QComboBox::findData дает сбой, когда QVariant сохраняет std::vector

Рассмотрим этот код:

std::vector< std::vector<int> > v;
v.push_back( std::vector<int>( 1, 4 ) );
v.push_back( std::vector<int>( 1, 3 ) );
QComboBox box;
box.addItem( "", QVariant::fromValue<std::vector<int>>( v[0] ) );
box.addItem( "", QVariant::fromValue<std::vector<int>>( v[1] ) );
int pos = box.findData( QVariant::fromValue<std::vector<int>>(v[0]) );

pos равно -1, хотя ожидалось 0.

Ручной поиск (от i до box.count()) выполним и работает. Поскольку ( box.itemData( 0 ).value< std::vector<int> >() == v[0] ) неожиданно возвращает true! Но findData тоже должен работать!

Примечание. Добавление Q_DECLARE_METATYPE( std::vector<int> ); не помогло

Редактировать 2016/05/03: исправлена ​​ошибка Qt: https://bugreports.qt.io/browse/QTBUG-53152


person jpo38    schedule 29.04.2016    source источник
comment
Пробовали ли вы использовать тип, отличный от A, например int? Это изолирует, связана ли проблема с A или std::vector.   -  person anonymous    schedule 29.04.2016
comment
@JonHarper: Хороший вопрос. Та же проблема с int*, так что, видимо, проблема исходит от std::vector   -  person jpo38    schedule 29.04.2016
comment
Может попробовать Q_DECLARE_METATYPE(std::vector<A *>)?   -  person anonymous    schedule 29.04.2016
comment
@JonHarper: см. последнее примечание в моем посте, уже пробовал. Не имел никакого эффекта.   -  person jpo38    schedule 29.04.2016
comment
Мой ответ был совершенно неправильным. std::vector по умолчанию объявляется с Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE   -  person anonymous    schedule 29.04.2016
comment
Не проверял, даже с std::vector<int> не работает   -  person jpo38    schedule 02.05.2016
comment
@JonHarper: исправлено благодаря помощи Qt (см. опубликованный ответ)   -  person jpo38    schedule 09.05.2016
comment
Хорошая информация. Спасибо, что опубликовали ответ.   -  person anonymous    schedule 09.05.2016


Ответы (1)


QMetaType::registerComparators должен быть вызван, чтобы иметь operator== использоваться вместо побитового сравнения.

Звонок (один раз): QMetaType::registerComparators<std::vector<int>>(); заставляет findData работать.

person jpo38    schedule 09.05.2016