Implementación del desglose

Nota: Esto es parte del ejemplo de la Galería de Gráficos con Widgets.

Aquí creamos un gráfico de barras apiladas, que muestra la cosecha de varios chiles durante la temporada. En la vista de temporada, la cosecha se agrupa por meses. Para desglosar a la vista semanal, haga clic con el botón derecho del ratón en el mes seleccionado. En la vista semanal, la cosecha del mes pulsado se muestra por semanas.

La vista de temporada tiene este aspecto:

Captura de pantalla que muestra un gráfico de barras apiladas de la cosecha de Habanero, Lemon Drop, Starfish y Aji Amarillo a lo largo de cinco meses, de mayo a septiembre.

Al hacer clic en un mes, se muestra la cosecha de ese mes:

Captura de pantalla que muestra un gráfico de barras apiladas de la cosecha de Habanero, Lemon Drop, Starfish y Aji Amarillo en junio.

Primero definimos una clase de serie de desglose, que añade categorías a la serie de barras apiladas y la asignación de categorías a otras series de desglose. El propósito de la serie de desglose es contener el conocimiento de la estructura de desglose. La función mapDrilldownSeries mapea la categoría a una serie dada. Podemos solicitar el mapeo para una categoría con la función 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;
};

A continuación definimos nuestro propio gráfico de desglose, que implementa el manejador para el clic del ratón. Todas las clases derivadas de QBarSeries envían la señal clicked(QBarSet*, int) cuando se hace clic en una serie con el ratón. El parámetro QBarSet contiene el puntero a la serie de barras sobre la que se ha hecho clic y el parámetro int contiene el índice de la categoría sobre la que se ha hecho clic.

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;
};

Ahora ya tenemos nuestras clases de desglose y podemos empezar a utilizarlas. Primero creamos el gráfico.

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

Definimos las categorías a partir de las cuales se construirán las series de desglose.

// 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"
};

Para crear la estructura de desglose, primero creamos nuestra serie de nivel superior, que llamamos seasonSeries. Para cada mes en seasonSeries creamos una serie de desglose llamada weeklySeries que contiene datos más detallados para ese mes. En weeklySeries, utilizamos el controlador de desglose para volver a seasonSeries. Para ello añadimos un mapeo a la serie. La seasonSeries se mapea a weeklySeries para cada mes. Cada weeklySeries se mapea de nuevo a la seasonSeries. Para que el mapeo funcione, conectamos las señales de clic de nuestras series al 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);

Cuando tengamos lista nuestra estructura de desglose, podemos añadirle los datos. Aquí generamos una cosecha aleatoria para cada planta en cada semana. La cosecha mensual se calcula a partir de las cosechas semanales y se establece como valor de la serie mensual.

// 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);
}

Aquí configuramos el gráfico para que muestre inicialmente la serie de nivel superior.

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