Sur cette page

Qt Graphs Traitement des données avec 3D

Séries

Une série combine un ensemble d'éléments de données logiquement connectés et des propriétés visuelles qui décrivent la manière dont les éléments de données doivent être rendus, telles que les maillages et les couleurs des éléments. Chaque type de graphique possède son propre type de série. Par exemple, les diagrammes à barres utilisent QBar3DSeries. Plusieurs séries peuvent être ajoutées simultanément à tous les graphiques. Chaque série possède ses propres données.

Cet extrait de code montre comment utiliser QBar3DSeries pour rendre les barres sous forme de cylindres et avec un dégradé au lieu d'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);

Proxies de données

Les données que les utilisateurs souhaitent visualiser sont disponibles dans de nombreux formats, qui ne peuvent pas tous être pris en charge directement. C'est pourquoi Qt Graphs implémente des proxy de données, dans lesquels l'utilisateur peut introduire ses données dans un format connu. Chaque graphique possède un type de proxy de base dans sa série, qui prend des données dans un format adapté à ce graphique. En ce qui concerne la relation proxy-série, puisque les données sont stockées dans des séries, il est important de mentionner quelques points. Tout d'abord, avec cette implémentation, les utilisateurs peuvent accéder aux données par l'intermédiaire des séries. Si un utilisateur souhaite effectuer des opérations sur ces données, telles que l'ajout ou la suppression, il peut toujours effectuer ces opérations par l'intermédiaire du 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 est utilisé pour ajouter des données à la série en tant qu'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 le proxy de base lorsque vos données sont stockées dans un objet hypothétique myData, qui renvoie les données sous la forme d'un objet 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 de la série 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 passer d'un ensemble de données à l'autre, il est généralement plus efficace de stocker chaque ensemble dans une série différente et de 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 passer d'un ensemble à l'autre.

Modèles d'éléments et mappage des données

Pour les cas d'utilisation courants, Qt Graphs propose des mandataires spécialisés. L'un de ces cas est la présence de données dans un modèle d'élément (sous-classeQAbstractItemModel ), qui est un moyen courant de stocker des données dans les applications Qt. Chaque type du graphe propose une classe proxy spéciale à cette fin, par exemple, QItemModelBarDataProxy pour QBar3DSeries. Ces mandataires sont simples à utiliser : il suffit de leur fournir un pointeur sur le modèle d'élément contenant les données et de spécifier les règles de mise en correspondance des données dans un format que le mandataire de base peut traiter.

Le mappage fonctionne avec les rôles du modèle d'élément. Chaque élément de données du modèle peut avoir différentes valeurs pour différents rôles. Par exemple, avec QItemModelBarDataProxy, vous pouvez spécifier quel rôle est utilisé pour déterminer à quelle ligne l'élément appartient, 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 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 ont un seul rôle qui contient des informations que vous souhaitez associer à plusieurs valeurs. Un exemple typique est un champ d'horodatage lors de la génération d'un graphique à barres avec deux axes liés au temps, par exemple, les années et les mois. Pour permettre la mise en correspondance d'un seul rôle de modèle d'élément avec plusieurs champs de données, les mandataires de modèle d'élément doivent mettre en œuvre 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 mandataires peuvent également prendre en charge d'autres fonctionnalités, telles que QItemModelBarDataProxy, qui permet de mapper les lignes et les colonnes de QAbstractItemModel directement en lignes et en colonnes de graphique à barres.

Pour plus d'informations et d'exemples d'utilisation, voir les classes de mandataires individuelles : QItemModelBarDataProxy, QItemModelScatterDataProxy, et QItemModelSurfaceDataProxy.

Autres mandataires personnalisés

QHeightMapSurfaceDataProxy est un proxy spécialisé dans la génération d'un graphique de surface à partir d'une image de carte de hauteur. Voir la documentation de QHeightMapSurfaceDataProxy pour plus d'informations.

L'exemple de la galerie graphique, dans l'onglet Bar Graph, montre comment un proxy personnalisé peut être créé. 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 avec un mappeur associé.

Traitement des données en temps réel

Lorsque vous disposez d'un ensemble de données qui se met à jour rapidement, il est important de traiter les 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 pour éviter les réallocations inutiles lors de la construction du tableau à fournir au proxy.

Si vous devez

  • modifier l'ensemble des données pour chaque image, il est préférable dans la plupart des cas 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 image, il est toujours plus efficace de le faire en appelant une seule méthode plutôt que plusieurs appels affectant une seule ligne ou un seul élément chacun. Par exemple, l'ajout de dix lignes par un seul appel à QBarDataProxy::addRows() est beaucoup plus efficace que dix appels distincts à QBarDataProxy::addRow().

Bars3D est optimisé pour accéder uniquement aux données qui se trouvent dans la fenêtre de données et ne devrait donc pas subir de ralentissement notable, même si des 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 dispersion, tout changement dans les plages de la fenêtre de données exige que la visibilité de tous les points de données soit vérifiée, 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 dispersion, ne conservez dans le proxy que les données dont vous avez besoin.

Les données de surface, bien qu'elles soient similaires aux données de dispersion au niveau de l'élément, sont déjà assignées à des lignes et à des colonnes. Par conséquent, le moteur de rendu de surface peut optimiser le dessin en supposant que les données des lignes et des colonnes sont triées le long de leurs axes respectifs. Ce n'est pas 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.