【问题标题】:Reverse axis of QPolarChartQPolarChart 的反向轴
【发布时间】:2019-04-10 14:01:10
【问题描述】:

我需要修改QPolarChart 来创建Satellite SkyPlot

为此,我需要反转径向轴(仰角轴),以便将 90 放在原点上,将 0 放在外环上。

list of members for QValueAxis 中找到了setReverse 方法,这似乎可以满足我的需要。

但是,在仰角轴上执行setReverse(true) 并没有像我预期的那样翻转轴。

那我该如何反转轴呢?

这是运行此示例所需的最少代码:

#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();
}

更新:

看完Damien's comment

你可以检查 isReverse 如果命令 setReverse 被考虑

我通过将qDebug() &lt;&lt; elevationAxis-&gt;isReverse(); 放在elevationAxis-&gt;setReverse(true); 之前和之后进行测试,并分别打印出falsetrue

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

所以reverse 属性确实发生了变化。但是,这种变化不会在轴上直观地反映出来。

reverse 属性的 documentation 内容如下:

此属性保存是否使用反向轴。

默认值为false

直线、样条和散点系列支持反向轴, 以及带有笛卡尔图表的区域系列。所有轴相同 附加到同一系列的方向必须颠倒,如果一个是 反转或行为未定义。

极坐标图肯定不是笛卡尔图,所以这可能是问题的根源。

【问题讨论】:

  • with qwt.sourceforge.io/class_qwt_scale_engine.html#details:“轴上的比例可以明确设置 (QwtScaleDiv) ,或者从绘图项目中计算出来,使用可以为每个轴单独配置的算法 (QwtScaleEngine)。”和 QwtScaleEngine::Attribute::Inverted。很抱歉提出了不同的库,但我看不出 QtCharts 是正确的选择。
  • 您可以与isReverse 核对是否考虑了命令setReverse
  • @Damien 我刚刚通过将qDebug() &lt;&lt; elevationAxis-&gt;isReverse(); 放在elevationAxis-&gt;setReverse(true); 之前和之后立即进行了测试,它分别打印出falsetrue。所以reverse 属性确实发生了变化。但是,此更改并未反映在轴上。
  • 这不是笛卡尔图表,但该警告仅适用于区域系列,这不是您的情况(散点系列),因此它应该可以工作。第二个通知说与同一系列相关的所有轴必须颠倒(我试过但它仍然不起作用)。我暂时找不到问题。

标签: c++ qt qchart


【解决方案1】:

我无法让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)应该做的。它将完全按照您想要的方式显示您的系列,而无需修改任何数据计算方式。

在这里你可以看到它的样子:

它对我来说很成功。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2018-09-23
    • 2022-11-05
    • 2017-08-22
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    相关资源
    最近更新 更多