Mise en œuvre de l'exploration
Remarque : ceci fait partie de l'exemple « Galerie de graphiques avec widgets ».
Nous créons ici un graphique à barres empilées qui présente les récoltes de différents piments au cours de la saison. Dans la vue « Saison », les récoltes sont regroupées par mois. Pour accéder à la vue hebdomadaire, cliquez avec le bouton droit sur le mois sélectionné. Dans la vue hebdomadaire, les récoltes du mois sélectionné sont affichées par semaine.
La vue « Saison » se présente comme suit :

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

Nous définissons tout d’abord une classe de séries de décomposition, qui ajoute des catégories à la série de barres empilées et établit un mappage entre ces catégories et d’autres séries de décomposition. L’objectif de la série de décomposition est de contenir les informations relatives à la structure de décomposition. La fonction mapDrilldownSeries associe la catégorie à une série donnée. Nous pouvons demander le mappage d’une catégorie à l’aide de 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;
};Ensuite, nous définissons notre propre graphique de décomposition, qui implémente le gestionnaire de clic de souris. Toutes les classes dérivées de QBarSeries émettent le signal clicked(QBarSet*, int) lorsqu’on clique sur une série avec la souris. Le paramètre QBarSet contient le pointeur vers l’ensemble de barres sur lequel on a cliqué et le paramètre int contient l’index de la catégorie sur laquelle on a cliqué.
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 disposons désormais de nos classes de drilldown et 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 les séries de détail seront construites.
// 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 d'exploration, 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 d'exploration appelée `weeklySeries` qui contient des données plus détaillées pour ce mois. Dans `weeklySeries`, nous utilisons le gestionnaire de drill-down pour revenir à `seasonSeries`. Pour ce faire, nous ajoutons un mappage à la série. La série `seasonSeries` est mappée à `weeklySeries` pour chaque mois. Chaque série `weeklySeries` est remappée vers `seasonSeries`. Pour que le mappage fonctionne, nous connectons les signaux de clic 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);Une fois notre structure de détail prête, nous pouvons y ajouter les données. Ici, nous générons un rendement aléatoire pour chaque plante chaque semaine. Le rendement mensuel est calculé à partir des rendements hebdomadaires et est défini 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 initialement les séries 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.