Обратная ось QPolarChart - PullRequest
       32

Обратная ось QPolarChart

10 голосов
/ 10 апреля 2019

Мне нужно изменить QPolarChart, чтобы создать Satellite SkyPlot .

Для этого мне нужно повернуть радиальную ось (ось возвышения) так, чтобы 90 помещалось в начало координат, а 0 - на внешнее кольцо.

В списке членов для QValueAxis я нашел метод setReverse, который, кажется, делает то, что мне нужно.

Однако выполнение setReverse(true) на оси возвышения не переворачивает ось, как я ожидал.

Как мне тогда повернуть ось?

Polar Chart

Это минимальный код, необходимый для запуска этого примера:

#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtCharts/QChartView>
#include <QtCharts/QPolarChart>
#include <QtCharts/QValueAxis>
#include <QScatterSeries>

QT_CHARTS_USE_NAMESPACE

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QtCharts::QPolarChart *chart = new QtCharts::QPolarChart();
    chart->legend()->hide();

    QScatterSeries *series = new QScatterSeries();
    for (int i = 0; i < 360; i += 10) {
        series->append(i, i);
    }
    chart->addSeries(series);

    QValueAxis *azimuthAxis = new QValueAxis();
    azimuthAxis->setRange(0, 360);
    azimuthAxis->setTickCount(9);
    azimuthAxis->setLabelFormat("%d");
    azimuthAxis->setLabelsVisible(true);
    chart->addAxis(azimuthAxis, QPolarChart::PolarOrientationAngular);

    QValueAxis *elevationAxis = new QValueAxis();
    elevationAxis->setRange(0, 90);
    elevationAxis->setTickCount(7);
    elevationAxis->setLabelFormat("%d");
    elevationAxis->setLabelsVisible(true);
    elevationAxis->setReverse(true); // <-- REVERSE THE AXIS
    chart->addAxis(elevationAxis, QPolarChart::PolarOrientationRadial);

    QtCharts::QChartView *chartView = new QtCharts::QChartView();
    chartView->setChart(chart);
    chartView->setRenderHint(QPainter::Antialiasing);

    QMainWindow window;
    window.setCentralWidget(chartView);
    window.resize(800, 600);
    window.show();

    return app.exec();
}

UPDATE:

После прочтения Комментарий Дэмиена :

Вы можете проверить с помощью isReverse , была ли учтена команда setReverse

Я сделал тест, поставив qDebug() << elevationAxis->isReverse(); непосредственно перед и сразу после elevationAxis->setReverse(true);, и он выводит false и true соответственно.

qDebug() << elevationAxis->isReverse(); // <-- Prints out "false"
elevationAxis->setReverse(true);        // <-- REVERSE THE AXIS
qDebug() << elevationAxis->isReverse(); // <-- Prints out "true"

Таким образом, свойство reverse действительно изменено. Однако это изменение не отражается визуально на оси.

Документация для свойства reverse гласит:

Это свойство определяет, используется ли обратная ось.

По умолчанию установлено значение false.

Обратная ось поддерживается линией, сплайном и разбросом, а также ряд областей с декартовой диаграммой . Все оси одинаковы ориентация, прикрепленная к той же серии, должна быть обратной перевернуто или поведение не определено.

Полярная диаграмма, конечно, НЕ является декартовой, так что это может быть корнем проблемы.

1 Ответ

4 голосов
/ 14 мая 2019

Я не мог заставить setReversed(true) работать так, как пытался это сделать.

Поэтому я нашел другое решение: сделать это вручную.

Я напечатал серию в обратном порядке.путь:

QScatterSeries *series = new QScatterSeries();
for (int i = 0; i < 360; i += 10) {
    series->append(i, MAX_ELEVATION - i);
}

MAX_ELEVATION равно 90.

Затем я поменял названия меток.Для этого мне пришлось заменить QValueAxis на его производное QCategoryAxis.


Полный код

#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtCharts/QChartView>
#include <QtCharts/QPolarChart>
#include <QtCharts/QValueAxis>
#include <QScatterSeries>
#include <QtCharts/QCategoryAxis>

QT_CHARTS_USE_NAMESPACE

#define MAX_ELEVATION 90

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QtCharts::QPolarChart *chart = new QtCharts::QPolarChart();
    chart->legend()->hide();

    QScatterSeries *series = new QScatterSeries();
    for (int i = 0; i < 360; i += 10) {
        series->append(i, MAX_ELEVATION - i);
    }
    chart->addSeries(series);

    QValueAxis *azimuthAxis = new QValueAxis();
    azimuthAxis->setRange(0, 360);
    azimuthAxis->setTickCount(9);
    azimuthAxis->setLabelFormat("%d");
    azimuthAxis->setLabelsVisible(true);
    chart->addAxis(azimuthAxis, QPolarChart::PolarOrientationAngular);

    /*
    QValueAxis *elevationAxis = new QValueAxis();
    elevationAxis->setRange(0, 90);
    elevationAxis->setTickCount(7);
    elevationAxis->setLabelFormat("%d");
    elevationAxis->setLabelsVisible(true);
    elevationAxis->setReverse(true); // <-- REVERSE THE AXIS
    chart->addAxis(elevationAxis, QPolarChart::PolarOrientationRadial);
    */

    QCategoryAxis *elevationAxis = new QCategoryAxis;
    elevationAxis->setRange(0, MAX_ELEVATION);
    for(unsigned int i = 0; i <= MAX_ELEVATION; i += 15)
        elevationAxis->append(QString::number(MAX_ELEVATION-i), i);
    elevationAxis->setLabelsPosition(QCategoryAxis::AxisLabelsPositionOnValue);
    elevationAxis->setLabelsVisible(true);
    chart->addAxis(elevationAxis, QPolarChart::PolarOrientationRadial);


    QtCharts::QChartView *chartView = new QtCharts::QChartView();
    chartView->setChart(chart);
    chartView->setRenderHint(QPainter::Antialiasing);

    QMainWindow window;
    window.setCentralWidget(chartView);
    window.resize(800, 600);
    window.show();

    return app.exec();
}

Это эквивалентночто setReversed(true) должен сделать.Он будет отображать ваши серии именно так, как вы хотите, без каких-либо изменений способа вычисления данных.

Здесь вы можете увидеть, как это выглядит: Display

Он успешно сработал для меня.

Надеюсь, это поможет.

...