一.前言
文章只是楼主学习过程的记录,不能面面俱到,也不能每个点都讲到,不喜勿喷
二.QwtPolarPlot是啥
源码注释原文:
A plotting widget, displaying a polar coordinate system
这一个绘图小部件,可以显示极坐标系统
————————————————————————————————
An unlimited number of plot items can be displayed on
its canvas. Plot items might be curves (QwtPolarCurve), markers
(QwtPolarMarker), the grid (QwtPolarGrid), or anything else derived
from QwtPolarItem.
可以显示无限数量的plot项目在它的画布上,绘图项目可以是曲线(QwtPolarCurve),标记(QwtPolarMarker),网格(QwtPolarGrid),或者其他从QwtPolarItem派生的任何东西
三.使用举例
1.拖动一个qwtPlorPlot
2.基本使用
// 设置标题
ui->qwtPolarPlot->setTitle(QStringLiteral("qwtPolarPlot"));
// 设置背景颜色
ui->qwtPolarPlot->setPlotBackground (QBrush( Qt::yellow, Qt::SolidPattern ));
// 设置网格效果属性
QwtPolarGrid *grid = new QwtPolarGrid();
grid->setFont(QFont("Microsoft YaHei UI Light", 16, QFont::Bold));
grid->setPen(QPen(Qt::blue, 1, Qt::SolidLine));
// 设置坐标数值样式
grid->setAxisPen(QwtPolar::AxisTop,QPen(Qt::red));
grid->setAxisPen(QwtPolar::AxisRight,QPen(Qt::black));
grid->attach(ui->qwtPolarPlot);
// 添加数值(不设置网格,看不到效果)
ui->qwtPolarPlot->setScale(QwtPolar::ScaleAzimuth, 0, 360, 30); // 圆环数值范围
ui->qwtPolarPlot->setScale(QwtPolar::ScaleRadius, 0, 20, 1); // 半径范围
grid->showGrid(QwtPolar::AxisRight,true);
grid->showAxis(QwtPolar::AxisLeft,false);
grid->showAxis(QwtPolar::AxisTop,true);
grid->showAxis(QwtPolar::AxisBottom,false);
3.添加数据,这个控件可以显示曲线 标记啥的,这里选用了最简单的曲线作为例子
查阅文档知道QwtPolarCurve设置的数据类型是QwtSeriesData< QwtPointPolar >
QwtSeriesData< QwtPointPolar >中有三个纯虚函数需要我们来实现,分别是
virtual size_t size () const =0
virtual QwtPointPolar sample (size_t i) const =0
virtual QRectF boundingRect () const =0
3.1故先定一个数据类PolarData
class PolarData:public QwtSeriesData<QwtPointPolar>
{
virtual size_t size() const
{
return 360;
}
virtual QwtPointPolar sample(size_t size) const
{
double data;
double r;
data = size/180.0 *M_PI;
// ❤函数
r = 8.0 *(1-cos(data));
return QwtPointPolar(size,r);
}
virtual QRectF boundingRect() const
{
return QRectF(5.0,5.0,10,10);
}
};
3.2添加数据核心代码
QwtPolarCurve *polarCurve = new QwtPolarCurve();
polarCurve->setPen(QPen(Qt::darkGray,5));
PolarData *data = new PolarData();
polarCurve->setData(data);
polarCurve->attach(ui->qwtPolarPlot);
3.3全部代码
// 设置标题
ui->qwtPolarPlot->setTitle(QStringLiteral("qwtPolarPlot"));
// 设置背景颜色
ui->qwtPolarPlot->setPlotBackground (QBrush( Qt::yellow, Qt::SolidPattern ));
// 设置网格效果属性
QwtPolarGrid *grid = new QwtPolarGrid();
grid->setFont(QFont("Microsoft YaHei UI Light", 16, QFont::Bold));
grid->setPen(QPen(Qt::blue, 1, Qt::SolidLine));
// 设置坐标数值样式
grid->setAxisPen(QwtPolar::AxisTop,QPen(Qt::red));
grid->setAxisPen(QwtPolar::AxisRight,QPen(Qt::black));
grid->attach(ui->qwtPolarPlot);
// 添加数值(不设置网格,看不到效果)
ui->qwtPolarPlot->setScale(QwtPolar::ScaleAzimuth, 0, 360, 30); // 圆环数值范围
ui->qwtPolarPlot->setScale(QwtPolar::ScaleRadius, 0, 20, 1); // 半径范围
grid->showGrid(QwtPolar::AxisRight,false);
grid->showAxis(QwtPolar::AxisLeft,true);
grid->showAxis(QwtPolar::AxisTop,true);
grid->showAxis(QwtPolar::AxisBottom,false);
//
QwtPolarCurve *polarCurve = new QwtPolarCurve();
polarCurve->setPen(QPen(Qt::darkGray,5));
PolarData *data = new PolarData();
polarCurve->setData(data);
polarCurve->attach(ui->qwtPolarPlot);
三.其他
1.showGrid好像只能设置显示上和右的坐标,其他两个方向好像设置不了,设置了true属性,就会导致数值都挤到一起,如下图
(如果可以设置的话请评论指导一下,捣鼓了许多没搞出来)
grid->showGrid(QwtPolar::AxisRight,false);
grid->showAxis(QwtPolar::AxisLeft,true);
2.对于设置半径范围,setScale函数最后一个参数为设置步长,但是似乎设置没啥反应,他固定是4个层级的递增,我设置了范围是0-20,递增是1,但是界面上显示的5 -10 - 15,,经过测试发现,他这个应该是自动设置,小于或者大于都会自适应(若有错,请评论区指导)
ui->qwtPolarPlot->setScale(QwtPolar::ScaleRadius, 0, 20, 1); // 半径范围