Création de graphiques polaires

Remarque : ceci fait partie de l'exemple « Galerie de graphiques avec widgets ».

Il montre également comment implémenter le défilement et le zoom du graphique polaire, tout en illustrant visuellement la relation entre les graphiques polaires et les graphiques cartésiens.

Capture d'écran montrant une spline parsemée de points bleus et une étoile divisée en partie extérieure, partie intérieure et aire, le tout représenté sur un graphique polaire

La création d'un graphique polaire s'effectue à l'aide d'une instance QPolarChart au lieu d'une instance QChart.

auto chart = new QPolarChart;

Les axes sont créés de la même manière que pour les graphiques cartésiens, mais lorsque vous ajoutez des axes au graphique, vous pouvez utiliser des orientations polaires à la place des alignements.

auto angularAxis = new QValueAxis;
angularAxis->setTickCount(9); // First and last ticks are co-located on 0/360 angle.
angularAxis->setLabelFormat("%.1f");
angularAxis->setShadesVisible(true);
angularAxis->setShadesBrush(QBrush(QColor(249, 249, 255)));
chart->addAxis(angularAxis, QPolarChart::PolarOrientationAngular);

auto radialAxis = new QValueAxis;
radialAxis->setTickCount(9);
radialAxis->setLabelFormat("%d");
chart->addAxis(radialAxis, QPolarChart::PolarOrientationRadial);

Le zoom et le défilement d’un graphique polaire sont, d’un point de vue logique, presque identiques à ceux d’un graphique cartésien. La principale différence réside dans le fait que, lors du défilement le long de l’axe X (axe angulaire), c’est l’angle qui est utilisé à la place du nombre de pixels. Une autre différence est qu’il n’est pas possible d’effectuer un zoom sur un rectangle.

void PolarChartView::keyPressEvent(QKeyEvent *event)
{
    switch (event->key()) {
    case Qt::Key_Plus:
        chart()->zoomIn();
        break;
    case Qt::Key_Minus:
        chart()->zoomOut();
        break;
    case Qt::Key_Left:
        chart()->scroll(-1.0, 0);
        break;
    case Qt::Key_Right:
        chart()->scroll(1.0, 0);
        break;
    case Qt::Key_Up:
        chart()->scroll(0, 1.0);
        break;
    case Qt::Key_Down:
        chart()->scroll(0, -1.0);
        break;
    case Qt::Key_Space:
        switchChartType();
        break;
    default:
        QGraphicsView::keyPressEvent(event);
        break;
    }
}

Les mêmes axes et séries peuvent être utilisés à la fois dans les graphiques cartésiens et polaires, mais pas simultanément. Pour passer d’un type de graphique à l’autre, vous devez d’abord supprimer les séries et les axes de l’ancien graphique, puis les ajouter au nouveau. Si vous souhaitez conserver les plages des axes, celles-ci doivent également être copiées.

void PolarChartView::switchChartType()
{
    QChart *newChart;
    QChart *oldChart = chart();

    if (oldChart->chartType() == QChart::ChartTypeCartesian)
        newChart = new QPolarChart;
    else
        newChart = new QChart;

    // Move series and axes from old chart to new one
    const QList<QAbstractSeries *> seriesList = oldChart->series();
    const QList<QAbstractAxis *> axisList = oldChart->axes();
    QList<QPair<qreal, qreal> > axisRanges;

    for (QAbstractAxis *axis : axisList) {
        auto valueAxis = static_cast<QValueAxis *>(axis);
        axisRanges.append(QPair<qreal, qreal>(valueAxis->min(), valueAxis->max()));
    }

    for (QAbstractSeries *series : seriesList)
        oldChart->removeSeries(series);

    for (QAbstractAxis *axis : axisList) {
        oldChart->removeAxis(axis);
        newChart->addAxis(axis, axis->alignment());
    }

    for (QAbstractSeries *series : seriesList) {
        newChart->addSeries(series);
        for (QAbstractAxis *axis : axisList)
            series->attachAxis(axis);
    }

    int count = 0;
    for (QAbstractAxis *axis : axisList) {
        axis->setRange(axisRanges[count].first, axisRanges[count].second);
        count++;
    }

    newChart->setTitle(oldChart->title());
    setChart(newChart);
    delete oldChart;
}

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