Qt Graphs Gestion des données en 3D
Séries
Une série regroupe un ensemble d’éléments de données logiquement liés, ainsi que des propriétés visuelles décrivant la manière dont ces éléments doivent être affichés, telles que les maillages et les couleurs. Chaque type de graphique dispose de son propre type de série. Par exemple, les graphiques à barres utilisent QBar3DSeries. Tous les graphiques peuvent comporter plusieurs séries ajoutées simultanément. Chaque série possède ses propres données.
Cet extrait de code montre comment utiliser ` QBar3DSeries ` pour afficher les barres sous forme de cylindres et avec un dégradé plutôt qu'une couleur 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);Proxys de données
Les données que les utilisateurs souhaitent visualiser se présentent sous de nombreux formats, qui ne peuvent pas tous être pris en charge directement. C’est pourquoi Qt Graphs met en œuvre des proxys de données, dans lesquels l’utilisateur peut injecter ses données dans un format connu. Chaque graphique dispose d’un type de proxy de base dans ses séries, qui accepte les données dans un format adapté à ce graphique. Compte tenu de la relation entre le proxy et les séries, et du fait que les données sont stockées dans les séries, il est important de souligner quelques points. Tout d’abord, grâce à cette implémentation, les utilisateurs peuvent accéder aux données via les séries. Si un utilisateur souhaite effectuer des opérations sur ces données, telles que des ajouts ou des suppressions, il peut toujours les réaliser via le proxy. Cependant, pour effectuer ces opérations, il est nécessaire de créer une série associée à ce proxy.
Par exemple, le proxy de base pour QBar3DSeries est QBarDataProxy, qui sert à ajouter des données à la série sous forme d’objets QBarDataItem. Chaque QBarDataItem contient une seule valeur de barre. Des typedefs supplémentaires sont fournis pour les conteneurs QBarDataArray et QBarDataRow.
Cet extrait de code montre comment utiliser un proxy de base lorsque vos données sont stockées dans un objet hypothétique de type ` myData `, qui renvoie les données sous la forme ` 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);Remarque : les objets`Series` ne peuvent posséder qu’un seul proxy à la fois. Le proxy existant est supprimé lorsqu’un autre est attribué à la série. Les graphiques peuvent toutefois contenir plusieurs séries. Si vous devez basculer entre deux ensembles de données différents, il est généralement plus efficace de stocker chaque ensemble dans une série distincte et de simplement changer de série, plutôt que de réinitialiser les données de la série à l’aide d’un proxy à chaque fois que vous devez changer d’ensemble.
Modèles d’éléments et mappage des données
Pour les cas d’utilisation courants, Qt Graphs propose des proxys spécialisés. C’est notamment le cas lorsque les données se trouvent dans un modèle d’élément (sous-classe deQAbstractItemModel ), ce qui est une méthode courante de stockage des données dans les applications Qt. Chacun des types de graphe propose une classe de proxy spécifique à cet effet, par exemple QItemModelBarDataProxy pour QBar3DSeries. Ces proxys sont simples à utiliser : il suffit de leur fournir un pointeur vers le modèle d’élément contenant les données, puis de spécifier les règles de mappage permettant de convertir les données dans un format que le proxy de base peut traiter.
Le mappage s'effectue à l'aide des rôles du modèle d'éléments. Chaque élément de données du modèle peut avoir des valeurs différentes selon les rôles. Par exemple, avec QItemModelBarDataProxy, vous pouvez spécifier quel rôle sert à déterminer à quelle ligne appartient l’élément, quel rôle fait de même pour les colonnes, et quel rôle spécifie la valeur de l’élément. Lorsque le proxy résout les données à partir du modèle, il utilise ces mappages pour générer les lignes et les colonnes du graphique à barres.
Souvent, les modèles d’éléments comportent un seul rôle contenant des informations que vous souhaitez mapper à plusieurs valeurs. Un exemple typique est celui d’un champ d’horodatage lors de la génération d’un graphique à barres comportant deux axes temporels, par exemple les années et les mois. Pour permettre le mappage d’un seul rôle de modèle d’élément à plusieurs champs de données, les proxys de modèles d’éléments doivent implémenter un mécanisme de correspondance et de remplacement de motifs. Vous pouvez également utiliser ce mécanisme pour reformater les données, même dans les cas de mappage un-à-un.
Selon le type de graphique, les proxys peuvent également prendre en charge d’autres fonctionnalités, telles que QItemModelBarDataProxy le mappage facultatif des lignes et colonnes d’un tableau de données ( QAbstractItemModel ) directement en lignes et colonnes d’un graphique à barres.
Consultez les classes de proxys individuelles pour obtenir plus d’informations et des exemples d’utilisation : QItemModelBarDataProxy, QItemModelScatterDataProxy et QItemModelSurfaceDataProxy.
Autres proxys personnalisés
QHeightMapSurfaceDataProxy est un proxy spécialisé permettant de générer un graphique de surface à partir d’une image de carte d’altitude. Consultez la documentation de QHeightMapSurfaceDataProxy pour plus d’informations.
L’exemple « Graph Gallery », dans l’onglet Bar Graph, montre comment créer un proxy personnalisé. Il définit un ensemble de données personnalisé basé sur des listes de variantes et une extension du proxy de base pour résoudre ces données à l’aide d’un mappeur associé.
Gestion des données en temps réel
Lorsque vous disposez d’un ensemble de données qui s’actualise rapidement, il est important de traiter ces données correctement pour garantir de bonnes performances. L’allocation de mémoire étant une opération coûteuse, utilisez toujours ` QList::reserve()` et ` QList::resize()` dans la mesure du possible afin d’éviter des réallocations inutiles lors de la construction du tableau à transmettre au proxy.
Si vous devez :
- modifier l’ensemble de données dans son intégralité pour chaque trame, il est dans la plupart des cas préférable de réutiliser le tableau existant, en particulier si les dimensions du tableau ne changent pas.
- ajouter, insérer, supprimer ou modifier plusieurs lignes ou éléments pour chaque trame, il est toujours plus efficace de le faire via un seul appel de méthode plutôt que par plusieurs appels affectant chacun une seule ligne ou un seul élément. Par exemple, ajouter dix lignes avec un seul appel à ` QBarDataProxy::addRows()` est bien plus efficace que dix appels distincts à ` QBarDataProxy::addRow()`.
Bars3D est optimisé pour n’accéder qu’aux données se trouvant dans la fenêtre de données et ne devrait donc pas subir de ralentissement notable, même si davantage de données sont continuellement ajoutées à la série à l’aide du proxy.
En raison de la nature non triée des données de nuage de points, toute modification des plages de la fenêtre de données nécessite de vérifier la visibilité de tous les points de données, ce qui peut entraîner un ralentissement croissant si des données sont continuellement ajoutées au proxy. Pour obtenir les meilleures performances avec les graphiques de nuage de points, ne conservez dans le proxy que les données dont vous avez besoin.
Les données de surface, bien que similaires aux données de nuages de points au niveau des éléments, sont déjà réparties en lignes et en colonnes. Par conséquent, le moteur de rendu de surface peut optimiser le tracé en partant du principe que les données des lignes et des colonnes sont triées selon leurs axes respectifs. Ce n’est pas tout à fait aussi efficace que dans le cas des barres, mais presque.
© 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.