QChart还有专门画极坐标的类QPolarChart,它的界面是一个圆盘。注意在使用之前,包括命名空间QT_CHARTS_USE_NAMESPACE,.pro文件中也要增加QT += charts.
#include <QApplication>
#include <QDebug>
#include <QtCharts/QScatterSeries>
#include <QtCharts/QLineSeries>
#include <QtCharts/QPolarChart>
#include <QtCharts/QValueAxis>
#include <QtCharts/QChartView>
#include "mainwindow.h"
//[1]
QT_CHARTS_USE_NAMESPACE
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//曲线
QLineSeries *seriesLine = new QLineSeries();
seriesLine->setName("LinePolar");
//图表
QPolarChart *polarChart = new QPolarChart();
polarChart->addSeries(seriesLine);
polarChart->setTitle("First Polar Chart");
//坐标轴
QValueAxis *angleAxis = new QValueAxis();
angleAxis->setTickCount(9);
angleAxis->setLabelFormat("%d");
//角度
polarChart->addAxis(angleAxis, QPolarChart::PolarOrientationAngular);
QValueAxis *radiusAxis = new QValueAxis();
radiusAxis->setTickCount(9);
radiusAxis->setLabelFormat("%d");
//半径
polarChart->addAxis(radiusAxis, QPolarChart::PolarOrientationRadial);
seriesLine->attachAxis(radiusAxis);
seriesLine->attachAxis(angleAxis);
radiusAxis->setRange(0, 360); //设置半径范围
angleAxis->setRange(0, 360); //设置角度范围
for (int i = 0; i <= 360; i += 10)
seriesLine->append(i, (i / 360.0) * 360);
QChartView *polarChartView = new QChartView();
polarChartView->setChart(polarChart);
MainWindow w;
w.SetWidget(polarChartView);
w.show();
return a.exec();
}
修改间隔:
setTickCount(int count)设置大刻度线的数目,默认是5,不能小于2。程序中设置的是9,但是数一下好像不对。setTickCount(4)换个4体验一下。对于半径,第4条线就是圆心,看不太出来。对于角度,第1条和第4条线会重合。
修改主题风格:
QPolarChart自带了一些主题,跟手机一样可以换主题,默认主题就是上面的效果,换个Dark主题:
polarChart->setTheme(QChart::ChartThemeDark); //设置主题
还有蓝色,棕色等其他主题,具体主题如下,具体颜色可以自己试试。
主题名 | 描述 |
QChart::ChartThemeLight | The light theme, which is the default theme. |
QChart::ChartThemeBlueCerulean | The cerulean blue theme. |
QChart::ChartThemeDark | The dark theme. |
QChart::ChartThemeBrownSand | The sand brown theme. |
QChart::ChartThemeBlueNcs | The natural color system (NCS) blue theme. |
QChart::ChartThemeHighContrast | The high contrast theme. |
QChart::ChartThemeBlueIcy | The icy blue theme. |
QChart::ChartThemeQt | The Qt theme. |
设置交替阴影:
为了实现交替颜色显示,实现可以通过设置以下阴影属性实现,默认颜色是黑色。
angleAxis->setShadesVisible(true);
为了适应不同的风格,颜色是可以自定义的:
angleAxis->setShadesBrush(QBrush(QColor(199, 144, 235)));
改线为点:
QLineSeries画出来的是线,将它改成QScatterSeries,画出来的是独立的点:
这个点的大小可以修改,通过setMarkerSize()设置大小
seriesLine->setMarkerSize(1); //设置点大小
修改坐标可以画出不同的图案,比如这样的螺旋线p=半徑*角度:
这条绿线是通过多个点组成,颜色也可以改,但是改成曲线的话,画出的效果不理想,如果谁用曲线画出来这样的欢迎告诉我.
for (double i=0; i<=360*2; i+=0.5) //添加点
{
auto angle = i;
while (angle > 360)
{
angle = angle - 360;
}
seriesLine->append(angle, i/2.0);
}
seriesLine->setPen(QPen(QColor(153, 232, 83), 2)); //设置线的颜色
完整的代码如下:
#include <QApplication>
#include <QDebug>
#include <QtCharts/QScatterSeries>
#include <QtCharts/QLineSeries>
#include <QtCharts/QPolarChart>
#include <QtCharts/QValueAxis>
#include <QtCharts/QChartView>
#include "mainwindow.h"
//[1]
QT_CHARTS_USE_NAMESPACE
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//曲线
QScatterSeries *seriesLine = new QScatterSeries(); //点1
seriesLine->setName("LinePolar");
seriesLine->setMarkerSize(1); //设置点大小1
//图表
QPolarChart *polarChart = new QPolarChart();
polarChart->addSeries(seriesLine);
polarChart->setTheme(QChart::ChartThemeBlueCerulean); //设置主题 1
polarChart->setTitle("First Polar Chart");
//坐标轴
QValueAxis *angleAxis = new QValueAxis();
angleAxis->setTickCount(9);
angleAxis->setLabelFormat("%d");
angleAxis->setShadesVisible(true); //增加shade区域 1
angleAxis->setShadesBrush(QBrush(QColor(19, 44, 25)));
polarChart->addAxis(angleAxis, QPolarChart::PolarOrientationAngular);
QValueAxis *radiusAxis = new QValueAxis();
radiusAxis->setTickCount(9);
radiusAxis->setLabelFormat("%d");
polarChart->addAxis(radiusAxis, QPolarChart::PolarOrientationRadial);
seriesLine->attachAxis(radiusAxis);
seriesLine->attachAxis(angleAxis);
//[1]!
radiusAxis->setRange(0, 360);
angleAxis->setRange(0, 360);
// 多圈
for (double i=0; i<=360*2; i+=0.5)
{
auto angle = i;
while (angle > 360)
{
angle = angle - 360;
}
seriesLine->append(angle, i/2.0);
}
seriesLine->setPen(QPen(QColor(153, 232, 83), 2));
//[1]
QChartView *polarChartView = new QChartView();
polarChartView->setChart(polarChart);
MainWindow w;
w.SetWidget(polarChartView);
w.show();
//[1]!
return a.exec();
}
再画几个其他类型的线:
四叶曲线1 p=半径*fabs(sin(2*角度)):
int radius = 200;
for (double angle=0; angle<=360; angle+=1)
{
seriesLine->append(angle, qFabs(radius*qSin(2.0*M_PI*angle/180.0)));
}
四叶曲线2 p=半径*fabs(cos(2*角度)):
int radius = 200;
for (double angle=0; angle<=360; angle+=1)
{
seriesLine->append(angle, qFabs(radius*qCos(2.0*M_PI*angle/180.0)));
}
六叶花瓣
//六叶花瓣 p=半径*fabs(cos(3*角度))
int radius = 200;
for (double angle=0; angle<=360; angle+=1)
{
seriesLine->append(angle, qFabs(radius*qCos(3.0*M_PI*angle/180.0)));
}
三叶花瓣:
//三叶花瓣 p=半径*cos(3*角度)
int radius = 200;
for (double angle=0; angle<=360; angle+=1)
{
seriesLine->append(angle, radius*qCos(3.0*M_PI*angle/180.0));
}
玫瑰曲线有规律,
r = sin ( k θ ) 或 r = cos ( k θ )
当 k 是奇数时,玫瑰曲线有 k 个花瓣;当 k 是偶数时,玫瑰曲线有 2k 个花瓣。
心形曲线
//心形曲线 p=半径*(1-cos(角度))
int radius = 100;
for (double angle=0; angle<=360; angle+=1)
{
seriesLine->append(angle, radius*(1-qCos(M_PI*angle/180.0)));
}
这心形下方还挺饱满,跟扑克上的红心差很大