Есть ли причина, по которой QVariant принимает только QList, а не QVector или QLinkedList? - PullRequest
7 голосов
/ 30 мая 2011

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

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

  1. С std::vector до QVector
  2. С QVector до QList

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

Ответы [ 4 ]

12 голосов
/ 30 мая 2011

вы можете хранить все в 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, он вызывает конструктор по умолчанию, конструктор копирования и деструктор, манипулируя элементами этого типа. Поэтому использовать его с классами и объектами не вредно.

6 голосов
/ 31 мая 2011

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

2 голосов
/ 30 мая 2011

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

0 голосов
/ 30 мая 2011

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

Бьюсь об заклад, вы обнаружите, что QVector компилируется просто отлично.

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

...