c++ - QPolarChart 的反向轴
问题描述
我需要修改 aQPolarChart
以创建Satellite SkyPlot。
为此,我需要反转径向轴(仰角轴),以便将 90 放置在原点上,将 0 放置在外环上。
在成员列表中,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
内容如下:
此属性保存是否使用反向轴。
默认情况下,该值为
false
。反向轴由线、样条和散点系列以及带笛卡尔图的面积系列支持。如果一个轴被反转或行为未定义,则必须反转连接到同一系列的所有相同方向的轴。
极坐标图当然不是笛卡尔图,所以这可能是问题的根源。
解决方案
无论如何我都无法完成这项setReversed(true)
工作。
所以我找到了另一个解决方案:手动操作。
我以相反的方式打印了该系列:
QScatterSeries *series = new QScatterSeries();
for (int i = 0; i < 360; i += 10) {
series->append(i, MAX_ELEVATION - i);
}
MAX_ELEVATION
等于90
。
然后我颠倒了标签名称。为此,我不得不QValueAxis
用它的derived替换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)
应该做什么。它将完全按照您想要的方式显示您的系列,而无需修改任何数据计算方式。
它对我来说很成功。
希望它可以提供帮助。
推荐阅读
- javascript - ajax 仅输出循环 forEach 中的最后一条记录
- lua - Roblox Workspace 中的 NumberValue 没有改变
- javascript - 如何修复 Prestashop 模块中的“未捕获的类型错误:无法读取未定义的属性“拆分”错误
- testing - 是否有一种(惯用的)方法可以在 Clojure 中测试 IO 函数的结果?
- sql - SQL如何创建一个计数,该计数在一定行数后移动到下一个数字,然后循环回来重新开始
- css - CSS:每行一个 DIV,在 DIV 内水平堆叠图像和文本,并应用边距
- database - 什么散列算法可以安全地用于散列关键字集,以便为数据库表生成唯一键?
- reactjs - react-create-app怎么把img保存在里面?
- visual-studio-code - 从 vscode.ExtensionContext.globalState 中移除无用的键
- javascript - “如何在 Javascript 中编写二维数组输入,使其看起来像这样?”