Création de graphiques polaires

Remarque : cet exemple fait partie de l'exemple de la galerie Charts with Widgets.

Il montre également comment mettre en œuvre le défilement et le zoom du graphique polaire et comment démontrer visuellement comment les graphiques polaires et les graphiques cartésiens sont liés les uns aux autres.

Capture d'écran montrant une spline où les points bleus se dispersent et une étoile divisée par l'intérieur extérieur et la surface de l'étoile, le tout dans un diagramme polaire.

La création d'un graphique polaire se fait avec 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 des axes sont ajoutés au graphique, vous pouvez utiliser des orientations polaires au lieu d'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 logiquement presque identiques au zoom et au défilement d'un graphique cartésien. La principale différence est que lors du défilement le long de l'axe X (axe angulaire), l'angle est utilisé au lieu du nombre de pixels. Une autre différence est qu'il n'est pas possible de zoomer 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 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 d'axes, vous devez également les copier.

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.