Drilldown implementieren
Hinweis: Dies ist ein Teil des Beispiels für die Diagramme mit Widgets-Galerie.
Hier erstellen wir ein gestapeltes Balkendiagramm, das die Ernte von verschiedenen Chilischoten während der Saison zeigt. In der Saisonansicht ist die Ernte nach Monaten gruppiert. Um die Wochenansicht aufzuschlüsseln, klicken Sie mit der rechten Maustaste auf den ausgewählten Monat. In der Wochenansicht wird die Ernte des angeklickten Monats wochenweise angezeigt.
Die Saisonansicht sieht wie folgt aus:
Wenn Sie auf einen Monat klicken, wird die Ernte des betreffenden Monats angezeigt:
Zunächst definieren wir eine Drilldown-Reihenklasse, die der gestapelten Balkenreihe Kategorien hinzufügt und die Kategorien anderen Drilldown-Reihen zuordnet. Der Zweck der Drilldown-Serien ist es, Wissen über die Drilldown-Struktur zu enthalten. Die Funktion mapDrilldownSeries ordnet die Kategorie einer bestimmten Reihe zu. Wir können die Zuordnung für eine Kategorie mit der Funktion drilldownSeries(int category) abfragen.
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; };
Als nächstes definieren wir unser eigenes Drilldown-Diagramm, das den Handler für den Mausklick implementiert. Alle von QBarSeries abgeleiteten Klassen senden das Signal clicked(QBarSet*, int) aus, wenn eine Reihe mit der Maus angeklickt wird. Der Parameter QBarSet enthält den Zeiger auf den angeklickten Balkensatz und der Parameter int enthält den Index der angeklickten Kategorie.
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; };
Jetzt haben wir unsere Drilldown-Klassen und können mit ihrer Verwendung beginnen. Erstellen Sie zunächst das Diagramm.
auto drilldownChart = new StackedDrilldownChart; drilldownChart->setAnimationOptions(QChart::SeriesAnimations);
Wir definieren die Kategorien, aus denen die Drilldown-Serien aufgebaut werden sollen.
// 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" };
Um die Drilldown-Struktur zu erstellen, legen wir zunächst unsere oberste Reihe an, die wir seasonSeries nennen. Für jeden Monat in seasonSeries erstellen wir eine Drilldown-Reihe namens weeklySeries, die detailliertere Daten für diesen Monat enthält. In weeklySeries verwenden wir den Drilldown-Handler, um zu seasonSeries zurückzukehren. Zu diesem Zweck fügen wir der Serie eine Zuordnung hinzu. Die seasonSeries wird für jeden Monat auf weeklySeries abgebildet. Jede weeklySeries wird auf die seasonSeries zurück abgebildet. Damit das Mapping funktioniert, verbinden wir die angeklickten Signale aus unseren Reihen mit dem 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);
Wenn wir unsere Drilldown-Struktur fertig haben, können wir die Daten hinzufügen. Hier erzeugen wir für jede Pflanze in jeder Woche eine zufällige Ernte. Die monatliche Ernte wird aus den wöchentlichen Ernten berechnet und als Wert für die monatliche Reihe festgelegt.
// 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); }
Hier stellen wir das Diagramm so ein, dass es zunächst die oberste Reihe anzeigt.
// Show season series in initial view drilldownChart->changeSeries(seasonSeries); drilldownChart->setTitle(seasonSeries->name());
© 2025 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.