Есть ли причина, по которой QVariant принимает только QList, а не QVector или QLinkedList

QVariant принимает QList<QVariant>, а не QVector<QVariant>, ни QLinkedList<QVariant>. Это просто потому, что он видит QList, QVector и QLinkedList как принципиально схожие (в абстрактном смысле) структуры данных?

я добавляю и std::vector до QVariant. Если используется только Qt API, а не ручное преобразование, для этого требуется два преобразования:

  1. С std::vector to QVector
  2. С QVector в QList

PS: Я знаю, что могу добавить std::vector to QVariant непосредственно с этой но я верю, что в таком случае он не будет знать, что это вектор объектов.

4 ответов


просто потому, что QList является наиболее часто используемым типом контейнера, и добавление перегрузок для всех остальных сделало бы интерфейс QVariant еще более сложным, чем он уже есть. В любом случае, ваша проблема будет не в том, что QVariant не поддерживает QVector (это с небольшим трудом), но что QJson нет. Я сомневаюсь, что дополнительный вызов QVector::список() приведет к существенному снижению производительности.


вы можете хранить все в QVariant, после вызова функции qRegisterMetaType.

Так что если вы называете qRegisterMetaType<std::vector<SomeObject> >("std::vector<SomeObject>"); QVariant будет хранить std:: vector. чтение таких значений из него, выполняющего функцию T QVariant::value () const , для записи использовать функцию void QVariant::setValue ( const T & value )

PS: Я знаю, что могу добавить std:: vector в QVariant непосредственно с этим, но я считаю, что в этом случае он не будет знать, что это вектор объектов.

при регистрации типа на QVariant, он вызывает конструктор по умолчанию, конструктор копирования и деструктор при манипулировании элементами этого типа. Поэтому нет никакого вреда использовать его с классами и объектами.


для таких шаблонных классов вы должны регистрировать каждый конкретный экземпляр в мета-системе индивидуально. Очевидно, тролли почувствовали необходимость использовать QList<QVariant>, но никто из других, поэтому они зарегистрировали только один. Нет никаких особых причин, по которым вы не могли бы зарегистрировать их сами.


Я не на 100% уверен в реализации QVariant, но я считаю, что размер QVariant не определяется до времени выполнения. Это означает, что при попытке написать QVector компилятор не знает, сколько места выделить, поэтому сообщает об ошибке. То же самое верно для LinkedList. QList работает, потому что его реализация зависит только от указателей.

Я уверен, вы найдете, что qvector компилируется просто отлично.

большое предостережение: я не эксперт по Qt, поэтому я могу быть на этом. Но, надеюсь, по крайней мере, это заставит вас думать в правильном направлении.