Mise en œuvre de la fonction Drilldown
Note : Ceci fait partie de l'exemple de la galerie Charts with Widgets.
Nous créons ici un diagramme à barres empilées qui montre la récolte de différents piments au cours de la saison. En mode saison, la récolte est regroupée par mois. Pour passer à l'affichage hebdomadaire, cliquez avec le bouton droit de la souris sur le mois sélectionné. Dans la vue hebdomadaire, la récolte du mois sur lequel vous avez cliqué est affichée par semaine.
La vue de la saison se présente comme suit :

En cliquant sur un mois, la récolte de ce mois s'affiche :

Nous définissons tout d'abord une classe de série d'analyse descendante, qui ajoute des catégories à la série de barres empilées et établit des correspondances entre les catégories et d'autres séries d'analyse descendante. L'objectif de la série d'éclatement est de contenir la connaissance de la structure d'éclatement. La fonction mapDrilldownSeries associe la catégorie à une série donnée. Nous pouvons demander la correspondance pour une catégorie avec la fonction drilldownSeries(int category).
class StackedDrilldownSeries : public QStackedBarSeries { Q_OBJECT public: StackedDrilldownSeries(const QStringList &categories, int maxValue, QObject *parent = nullptr); void mapDrilldownSeries(int index, StackedDrilldownSeries *drilldownSeries); StackedDrilldownSeries *drilldownSeries(int index) const; QStringList categories() const; int maxValue() const; private: QMap<int, StackedDrilldownSeries *> m_drilldownSeries; QStringList m_categories; int m_maxValue = 0; };
Nous définissons ensuite notre propre graphique drilldown, qui met en œuvre le gestionnaire de clics de souris. Toutes les classes dérivées de QBarSeries envoient le signal clicked(QBarSet*, int) lorsqu'une série est cliquée avec la souris. Le paramètre QBarSet contient le pointeur sur la série de barres cliquées et le paramètre int contient l'indice de la catégorie cliquée.
class StackedDrilldownChart : public QChart { Q_OBJECT public: explicit StackedDrilldownChart(QGraphicsItem *parent = nullptr, Qt::WindowFlags wFlags = {}); void changeSeries(StackedDrilldownSeries *series); public slots: void handleClicked(int index, QBarSet *); private: StackedDrilldownSeries *m_currentSeries = nullptr; QBarCategoryAxis *m_axisX = nullptr; QValueAxis *m_axisY = nullptr; };
Nous avons maintenant nos classes d'exploration et nous pouvons commencer à les utiliser. Commençons par créer le graphique.
auto drilldownChart = new StackedDrilldownChart; drilldownChart->setAnimationOptions(QChart::SeriesAnimations);
Nous définissons les catégories à partir desquelles la série d'analyses descendantes sera construite.
// Define categories const QStringList months = { "May", "Jun", "Jul", "Aug", "Sep" }; const QStringList weeks = { "week 1", "week 2", "week 3", "week 4" }; const QStringList plants = { "Habanero", "Lemon Drop", "Starfish", "Aji Amarillo" };
Pour créer la structure de l'analyse descendante, nous commençons par créer notre série de niveau supérieur, que nous appelons seasonSeries. Pour chaque mois de seasonSeries, nous créons une série descendante appelée weeklySeries qui contient des données plus détaillées pour ce mois. Dans weeklySeries, nous utilisons le gestionnaire de recherche pour nous ramener à seasonSeries. Pour ce faire, nous ajoutons un mappage à la série. La série saisonnière est associée à la série hebdomadaire pour chaque mois. Chaque weeklySeries est reliée à la seasonSeries. Pour que le mappage fonctionne, nous connectons les signaux cliqués de nos séries au drilldownChart.
// Create drilldown structure auto seasonSeries = new StackedDrilldownSeries(months, 320, drilldownChart); seasonSeries->setName("Crop by month - Season (Click on bar to drill down)"); // Each month in season series has drilldown series for weekly data for (int month = 0; month < months.count(); month++) { // Create drilldown series for every week auto weeklySeries = new StackedDrilldownSeries(weeks, 80, drilldownChart); seasonSeries->mapDrilldownSeries(month, weeklySeries); // Drilling down from weekly data brings us back to season data. for (int week = 0; week < weeks.count(); week++) { weeklySeries->mapDrilldownSeries(week, seasonSeries); weeklySeries->setName(QString("Crop by week - " + months.at(month))); } // Use clicked signal to implement drilldown QObject::connect(weeklySeries, &StackedDrilldownSeries::clicked, drilldownChart, &StackedDrilldownChart::handleClicked); } // Enable drilldown from season series using clicked signal QObject::connect(seasonSeries, &StackedDrilldownSeries::clicked, drilldownChart, &StackedDrilldownChart::handleClicked);
Lorsque notre structure de recherche est prête, nous pouvons y ajouter les données. Ici, nous générons une récolte aléatoire pour chaque plante et chaque semaine. La récolte mensuelle est calculée à partir des récoltes hebdomadaires et est définie comme valeur de la série mensuelle.
// Fill monthly and weekly series with data for (const QString &plant : plants) { auto monthlyCrop = new QBarSet(plant); for (int month = 0; month < months.count(); month++) { auto weeklyCrop = new QBarSet(plant); for (int week = 0; week < weeks.count(); week++) *weeklyCrop << QRandomGenerator::global()->bounded(20); // Get the drilldown series from season series and add crop to it. seasonSeries->drilldownSeries(month)->append(weeklyCrop); *monthlyCrop << weeklyCrop->sum(); } seasonSeries->append(monthlyCrop); }
Ici, nous configurons le graphique pour qu'il affiche d'abord la série de niveau supérieur.
// Show season series in initial view drilldownChart->changeSeries(seasonSeries); drilldownChart->setTitle(seasonSeries->name());
© 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.