2011-05-30 11 views
5

QVariant parece aceptar QList<QVariant> y no QVector<QVariant> ni QLinkedList<QVariant>. ¿Es simplemente porque ve QList, QVector y QLinkedList como estructuras de datos fundamentalmente similares (en un sentido abstracto)?¿Existe alguna razón por la que QVariant solo acepta QList y no QVector ni QLinkedList?

Estoy añadiendo std::vector a un QVariant. Si se utiliza sólo el API de Qt y no una conversión manual, esto requiere dos conversiones:

  1. De std::vector a QVector
  2. De QVector a QList

PS: Soy consciente de que puedo añadir std::vector a QVariant directamente con this pero creo que en ese caso no sabrá que es un vector de objetos.

+0

Estoy confundido acerca de lo que está preguntando.Primero, analice las listas y vectores de QVariants, y luego discuta el almacenamiento de std :: vector en un QVariant. ¿Hay dos preguntas separadas aquí? – Nathanael

+0

¿Por qué no utilizar un 'boost :: any'? – Puppy

+0

La primera pregunta es el enfoque. La segunda declaración simplemente describe para qué la estoy usando. –

Respuesta

4

Simplemente porque QList es, con mucho, el tipo de contenedor más comúnmente usado, y agregar sobrecargas para todos los demás haría que la interfaz QVariant sea aún más compleja de lo que ya es. En cualquier caso, su problema parece ser que QVariant no es compatible con QVector (lo hace con un poco de trabajo) pero que QJson no lo hace. Dudo que una llamada adicional a QVector :: toList() cause una sobrecarga de rendimiento significativa.

0

No estoy 100% seguro de la implementación de QVariant, pero creo que el tamaño de un QVariant no se determina hasta el tiempo de ejecución. Esto significa que si intentas escribir QVector < QVariant> el compilador no sabe cuánto espacio asignar, por lo que informa un error. Lo mismo es cierto para LinkedList. QList funciona porque su implementación depende estrictamente de los punteros.

Apuesto a que encontrará que QVector < QVariant *> compila muy bien.

Gran advertencia: no soy un experto en Qt, así que podría estar en esto. Pero espero que al menos esto te haga pensar en la dirección correcta.

+0

Para cualquier tipo, el tamaño debe conocerse en tiempo de compilación. Si no conoce el tamaño hasta el tiempo de ejecución, entonces debe confiar en el montón, en cuyo caso el tamaño real de la estructura se conocerá como el tamaño de un puntero. –

10

puede almacenar todo en QVariant, después de llamar a la función qRegisterMetaType.

así que si llama al qRegisterMetaType<std::vector<SomeObject> >("std::vector<SomeObject>"); QVariant WOULD store std :: vector. lectura de tales valores de la misma función T QVariant::value() const realizar, para escribir la función de uso void QVariant::setValue (const T & value)

PS: Soy consciente de que puedo añadir std :: vector a QVariant directamente con esto, pero creo que en ese caso no lo hará sabe que es un vector de objetos.

Cuando registra el tipo a QVariant, lo llama constructor predeterminado, copia constructor y destructor mientras manipula elementos de ese tipo. Entonces no hay daño usarlo con clases y objetos.

+0

Sí, pero el problema es que quiero que el 'QVariant' sea reconocido como una colección de elementos por otra biblioteca que espera tipos de Qt ([QJson] (http://qjson.sourceforge.net/)). Estoy usando QJson que funciona con 'QVariant' y no sabría qué hacer con un tipo" definido por el usuario "como' std :: vector'. –

1

Para clases con plantillas como estas, debe registrar cada instanciación específica con el meta sistema de forma individual. Aparentemente, los Trolls sintieron la necesidad de usar QList<QVariant>, pero ninguno de los otros, por lo que solo registraron el uno. No hay una razón específica para que usted no pueda registrarlos usted mismo.

Cuestiones relacionadas