Drilldown implementieren

Hinweis: Dies ist Teil des Beispiels „Diagramme mit Widgets-Galerie “.

Hier erstellen wir ein gestapeltes Balkendiagramm, das die Ernte verschiedener Chilischoten im Laufe der Saison darstellt. In der Saisonansicht ist die Ernte nach Monaten gruppiert. Um einen Drilldown in die Wochenansicht durchzuführen, klicken Sie mit der rechten Maustaste auf den ausgewählten Monat. In der Wochenansicht wird die Ernte des angeklickten Monats nach Wochen dargestellt.

Die Saisonansicht sieht wie folgt aus:

Screenshot, der ein gestapeltes Balkendiagramm der Ernteerträge von Habanero, Lemon Drop, Starfish und Aji Amarillo über einen Zeitraum von fünf Monaten von Mai bis September zeigt

Ein Klick auf einen Monat zeigt die Ernte dieses Monats an:

Screenshot mit einem gestapelten Balkendiagramm zur Ernte von Habanero, Lemon Drop, Starfish und Aji Amarillo im Juni

Zunächst definieren wir eine Drilldown-Serienklasse, die der gestapelten Balkenreihe Kategorien hinzufügt und die Kategorien anderen Drilldown-Serien zuordnet. Der Zweck der Drilldown-Serie besteht darin, Informationen zur Drilldown-Struktur zu enthalten. Die Funktion `mapDrilldownSeries` ordnet die Kategorie einer bestimmten Serie zu. Mit der Funktion `drilldownSeries(int category)` können wir die Zuordnung für eine Kategorie 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)“, 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;
};

Nun verfügen wir über unsere Drilldown-Klassen und können mit deren Verwendung beginnen. Erstellen Sie zunächst das Diagramm.

auto drilldownChart = new StackedDrilldownChart;
drilldownChart->setAnimationOptions(QChart::SeriesAnimations);

Wir definieren die Kategorien, aus denen die Drilldown-Reihen aufgebaut werden.

// 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, erstellen wir zunächst unsere oberste Reihe, 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“ nutzen wir den Drilldown-Handler, um zu „seasonSeries“ zurückzukehren. Dazu fügen wir der Reihe eine Zuordnung hinzu. Die „seasonSeries“ wird für jeden Monat der „weeklySeries“ zugeordnet. Jede „weeklySeries“ wird wiederum der „seasonSeries“ zugeordnet. Damit die Zuordnung funktioniert, verbinden wir die Klick-Signale unserer 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 unsere Drilldown-Struktur fertig ist, können wir die Daten hinzufügen. Hier generieren 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 Serie anzeigt.

// 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.