【发布时间】: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();
}
更新:
你可以检查
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 属性的 documentation 内容如下:
此属性保存是否使用反向轴。
默认值为
false。直线、样条和散点系列支持反向轴, 以及带有笛卡尔图表的区域系列。所有轴相同 附加到同一系列的方向必须颠倒,如果一个是 反转或行为未定义。
极坐标图肯定不是笛卡尔图,所以这可能是问题的根源。
【问题讨论】:
-
然后试试qwtpolar.sourceforge.io/class_qwt_polar_plot.html#details with which
-
with qwt.sourceforge.io/class_qwt_scale_engine.html#details:“轴上的比例可以明确设置 (QwtScaleDiv) ,或者从绘图项目中计算出来,使用可以为每个轴单独配置的算法 (QwtScaleEngine)。”和 QwtScaleEngine::Attribute::Inverted。很抱歉提出了不同的库,但我看不出 QtCharts 是正确的选择。
-
您可以与
isReverse核对是否考虑了命令setReverse -
@Damien 我刚刚通过将
qDebug() << elevationAxis->isReverse();放在elevationAxis->setReverse(true);之前和之后立即进行了测试,它分别打印出false和true。所以reverse属性确实发生了变化。但是,此更改并未反映在轴上。 -
这不是笛卡尔图表,但该警告仅适用于区域系列,这不是您的情况(散点系列),因此它应该可以工作。第二个通知说与同一系列相关的所有轴必须颠倒(我试过但它仍然不起作用)。我暂时找不到问题。