Qt Graphs Manejo de datos con 3D
Series
Una serie combina un conjunto conectado lógicamente de elementos de datos y propiedades visuales que describen cómo deben representarse los elementos de datos, como mallas de elementos y colores. Cada tipo de gráfico tiene su propio tipo de serie. Por ejemplo, los gráficos de barras utilizan QBar3DSeries. Todos los gráficos pueden tener múltiples series añadidas simultáneamente. Cada serie posee sus propios datos.
Este fragmento de código muestra cómo utilizar QBar3DSeries para representar barras como cilindros y con un gradiente en lugar de un color uniforme:
QQuickWidget quickWidget; Q3DBarsWidgetItem graph; graph.setWidget(&quickWidget); QBar3DSeries series; QLinearGradient barGradient(0, 0, 1, 100); barGradient.setColorAt(1.0, Qt::white); barGradient.setColorAt(0.0, Qt::black); series.setBaseGradient(barGradient); series.setColorStyle(QGraphsTheme::ColorStyle::ObjectGradient); series.setMesh(QAbstract3DSeries::Mesh::Cylinder); graph.addSeries(&series);
Datos aproximados
Los datos que los usuarios desean visualizar vienen en muchos formatos, todos los cuales no pueden ser soportados directamente. Por lo tanto, Qt Graphs implementa proxies de datos, en los que el usuario puede introducir sus datos en un formato conocido. Cada gráfico tiene un tipo de proxy básico en su serie, que toma los datos en un formato adecuado para ese gráfico. Con la relación proxy-serie, ya que los datos se almacenan en series, es importante mencionar algunos puntos. En primer lugar, con esta implementación, los usuarios pueden acceder a los datos a través de las series. Si un usuario quiere realizar operaciones sobre estos datos, como añadir o eliminar, todavía puede llevar a cabo estas operaciones a través del proxy. Sin embargo, para realizar estas operaciones, es necesario crear una serie asociada a este proxy.
Por ejemplo, el proxy básico para QBar3DSeries es QBarDataProxy, que se utiliza para añadir datos a la serie como objetos QBarDataItem. Cada QBarDataItem contiene un único valor de barra. Se proporcionan typedefs adicionales para los contenedores QBarDataArray y QBarDataRow.
Este fragmento de código muestra cómo utilizar proxy básico cuando sus datos se almacenan en un objeto myData hipotético, que devuelve los datos como QBarDataItems:
QQuickWidget quickWidget; Q3DBarsWidgetItem graph; graph.setWidget(&quickWidget); QBar3DSeries series; for (int i = 0; i < 10; ++i) { QBarDataRow dataRow; for (int j = 0; j < 5; ++j) dataRow.append(myData->getValue(i, j)); series.dataProxy()->addRow(dataRow); } graph.addSeries(&series);
Nota: Los objetos serie sólo pueden poseer un único proxy a la vez. El proxy existente se elimina cuando se asigna otro a la serie. Sin embargo, los gráficos pueden contener varias series. Si necesita cambiar entre dos conjuntos diferentes de datos, normalmente es más eficiente almacenar cada conjunto en una serie diferente y simplemente cambiar la serie, en lugar de restablecer los datos en la serie utilizando un proxy cada vez que necesite cambiar.
Modelos de elementos y asignación de datos
Para casos de uso comunes, Qt Graphs ofrece proxies especializados. Uno de estos casos es tener datos en un modelo de elementos (QAbstractItemModel subclass), que es una forma común de almacenar datos en aplicaciones Qt. Cada uno de los tipos del grafo ofrece una clase proxy especial para este propósito, por ejemplo, QItemModelBarDataProxy para QBar3DSeries. Estos proxies son sencillos de usar: proporciónales un puntero al modelo de ítem que contiene los datos, y especifica las reglas sobre cómo mapear los datos a un formato que el proxy básico pueda procesar.
El mapeo funciona con roles del modelo de elementos. Cada elemento de datos en el modelo puede tener diferentes valores para diferentes roles. Por ejemplo, con QItemModelBarDataProxy, puede especificar qué rol se utiliza para determinar a qué fila pertenece el elemento, qué rol hace lo mismo para las columnas y qué rol especifica el valor del elemento. Cuando el proxy resuelve los datos del modelo, utiliza estas asignaciones para generar las filas y columnas del gráfico de barras.
A menudo, los modelos de elementos tendrán un único rol que contiene información que desea asignar a múltiples valores. Un ejemplo típico de esto es un campo de fecha y hora cuando se genera un gráfico de barras con dos ejes relacionados con el tiempo, por ejemplo, años y meses. Para poder asignar un único rol de modelo de elemento a más de un campo de datos, los proxies de modelo de elemento deben implementar un mecanismo de coincidencia y sustitución de patrones. También puede utilizar este mecanismo para reformatear los datos incluso en casos de asignación uno a uno.
Dependiendo del tipo de gráfico, los proxies también pueden admitir otras funcionalidades, como QItemModelBarDataProxy, que puede asignar filas y columnas de QAbstractItemModel directamente a filas y columnas de un gráfico de barras.
Consulte las clases proxy individuales para obtener más información y ejemplos sobre cómo utilizarlas: QItemModelBarDataProxy, QItemModelScatterDataProxy, y QItemModelSurfaceDataProxy.
Otros proxies personalizados
QHeightMapSurfaceDataProxy es un proxy especializado para generar un gráfico de superficie a partir de una imagen de mapa de alturas. Consulte la documentación de QHeightMapSurfaceDataProxy para obtener más información.
El ejemplo de la Galería Gráfica, en la pestaña Bar Graph, muestra cómo se puede crear un proxy personalizado. Define un conjunto de datos personalizado basado en listas de variantes y una extensión del proxy básico para resolver esos datos con un mapeador asociado.
Tratamiento de datos en tiempo real
Cuando se tiene un conjunto de datos que se actualiza rápidamente, es importante manejar los datos adecuadamente para garantizar un buen rendimiento. Dado que la asignación de memoria es una operación costosa, utiliza siempre que sea posible QList::reserve() y QList::resize() para evitar reasignaciones innecesarias al construir el array que darás al proxy.
Si necesita
- cambiar todo el conjunto de datos para cada fotograma, en la mayoría de los casos es mejor reutilizar el array existente, especialmente si las dimensiones del array no cambian.
- añadir, insertar, eliminar o cambiar varias filas o elementos para cada fotograma, siempre es más eficiente hacerlo con una llamada al método en lugar de múltiples llamadas que afectan a una sola fila o elemento cada una. Por ejemplo, añadir diez filas con una sola llamada a QBarDataProxy::addRows() es mucho más eficiente que diez llamadas separadas a QBarDataProxy::addRow().
Bars3D está optimizado para acceder únicamente a los datos que se encuentran dentro de la ventana de datos y, por lo tanto, no debería sufrir una ralentización notable aunque se añadan continuamente más datos a la serie utilizando el proxy.
Debido a la naturaleza no ordenada de los datos de dispersión, cualquier cambio en los rangos de la ventana de datos requiere que se compruebe la visibilidad de todos los puntos de datos, lo que puede causar una ralentización creciente si se añaden continuamente datos al proxy. Para obtener el mejor rendimiento con los gráficos de dispersión, mantenga en el proxy sólo los datos que necesite.
Los datos de superficie, aunque a nivel de elemento son similares a los datos de dispersión, ya están asignados en filas y columnas. Por lo tanto, el renderizador de superficie puede optimizar el dibujo asumiendo que los datos en las filas y columnas están ordenados a lo largo de sus respectivos ejes. No es tan eficiente como en el caso de las barras, pero casi.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.