Qwt QwtPolarPlot类使用

1.概述

QwtPolarPlot是Qwt库中用于绘制极坐标图的类。它继承自QwtPolarItemDict和QFrame类,并且可以作为QwtPlot控件的一部分使用。

以下是类的继承关系图:

2.常用方法

设置标签:

  • void setTitle (const QString &)
  • void setTitle (const QwtText &)

设置范围:

  • void setScale (int scaleId, double min, double max, double step=0)

设置主刻度间隔的最大数量:

  • void setScaleMaxMinor (int scaleId, int maxMinor)

设置背景色:

  • void setPlotBackground (const QBrush &c)

插入图例:

  • void insertLegend (QwtAbstractLegend *, LegendPosition=RightLegend, double ratio=-1.0)

3.示例

源码:画Rose曲线时QwtPolarCurve设置的数据类型是**QwtSeriesData< QwtPointPolar >,**QwtSeriesData< QwtPointPolar >中有三个纯虚函数需要我们来实现,分别是

  • virtual size_t size () const =0
  • virtual QwtPointPolar sample (size_t i) const =0
  • virtual QRectF boundingRect () const =0
cpp 复制代码
#include "PolarPlotWidget.h"
#include "ui_PolarPlotWidget.h"
#include "qwt_plot.h"
#include "qwt_plot_curve.h"
#include "qwt_text.h"
#include "qwt_legend.h"
#include "qwt_symbol.h"
#include "qwt_plot_marker.h"
#include "qwt_plot_grid.h"
#include "qwt_scale_div.h"
#include "qwt_plot_canvas.h"
#include "qwt_plot_legenditem.h"
#include "qwt_math.h"
#include "qwt_plot_layout.h"
#include "qwt_plot_barchart.h"
#include "qwt_scale_draw.h"
#include "qwt_column_symbol.h"
#include "qwt_plot_renderer.h"
#include "qwt_plot_multi_barchart.h"
#include "qwt_polar_plot.h"
#include "qwt_polar_grid.h"
#include "qwt_polar_marker.h"
#include "qwt_polar_curve.h"

class Data : public QwtSeriesData< QwtPointPolar >
{
  public:
    Data( const QwtInterval& radialInterval,
            const QwtInterval& azimuthInterval, size_t size )
        : m_radialInterval( radialInterval )
        , m_azimuthInterval( azimuthInterval )
        , m_size( size )
    {
    }

    virtual size_t size() const QWT_OVERRIDE
    {
        return m_size;
    }

  protected:
    QwtInterval m_radialInterval;
    QwtInterval m_azimuthInterval;
    size_t m_size;
};

class RoseData : public Data
{
  public:
    RoseData( const QwtInterval& radialInterval,
            const QwtInterval& azimuthInterval, size_t size )
        : Data( radialInterval, azimuthInterval, size )
    {
    }

    virtual QwtPointPolar sample( size_t i ) const QWT_OVERRIDE
    {
        const double stepA = m_azimuthInterval.width() / m_size;
        const double a = m_azimuthInterval.minValue() + i * stepA;

        const double d = a / 360.0 * M_PI;
        const double r = m_radialInterval.maxValue() * qAbs( qSin( 4 * d ) );

        return QwtPointPolar( a, r );
    }

    virtual QRectF boundingRect() const QWT_OVERRIDE
    {
        if ( cachedBoundingRect.width() < 0.0 )
            cachedBoundingRect = qwtBoundingRect( *this );

        return cachedBoundingRect;
    }
};


static QwtPolarPlot *g_plot = nullptr;
static QwtPolarGrid *g_grid = nullptr;
static const QwtInterval s_radialInterval( 0.0, 10.0 );
static const QwtInterval s_azimuthInterval( 0.0, 360.0 );

PolarPlotWidget::PolarPlotWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::PolarPlotWidget)
{
    ui->setupUi(this);

    g_plot = new QwtPolarPlot(QwtText( "Polar Plot Demo" ), this);
    g_plot->setAutoReplot( false );
    g_plot->setPlotBackground( Qt::darkBlue );

    ui->verticalLayout->addWidget(g_plot);

    //设置角度范围
    g_plot->setScale( QwtPolar::Azimuth,
        s_azimuthInterval.minValue(), s_azimuthInterval.maxValue(),
        s_azimuthInterval.width() / 12 );

    g_plot->setScaleMaxMinor( QwtPolar::Azimuth, 2 );

    //设置半径范围
    g_plot->setScale( QwtPolar::Radius,
        s_radialInterval.minValue(), s_radialInterval.maxValue() );

    // 设置网格效果属性
    g_grid = new QwtPolarGrid();
    g_grid->setPen( QPen( Qt::white ) );
    for ( int scaleId = 0; scaleId < QwtPolar::ScaleCount; scaleId++ )
    {
        g_grid->showGrid( scaleId );
        g_grid->showMinorGrid( scaleId );

        QPen minorPen( Qt::gray );
        g_grid->setMinorGridPen( scaleId, minorPen );
    }
    g_grid->setAxisPen( QwtPolar::AxisAzimuth, QPen( Qt::black ) );

    g_grid->showAxis( QwtPolar::AxisAzimuth, true );
    g_grid->showAxis( QwtPolar::AxisLeft, false );
    g_grid->showAxis( QwtPolar::AxisRight, true );
    g_grid->showAxis( QwtPolar::AxisTop, true );
    g_grid->showAxis( QwtPolar::AxisBottom, false );
    g_grid->showGrid( QwtPolar::Azimuth, true );
    g_grid->showGrid( QwtPolar::Radius, true );
    g_grid->attach( g_plot );

    // 设置曲线
    const int numPoints = 200;
    QwtPolarCurve* curve = new QwtPolarCurve();
    curve->setStyle( QwtPolarCurve::Lines );
    curve->setTitle( "Rose" );
    curve->setPen( QPen( Qt::red, 2 ) );
    curve->setSymbol( new QwtSymbol( QwtSymbol::Rect,
        QBrush( Qt::cyan ), QPen( Qt::white ), QSize( 3, 3 ) ) );
    curve->setData(
        new RoseData( s_radialInterval, s_azimuthInterval, numPoints ) );
    curve->attach( g_plot );

    // 设置标记
    QwtPolarMarker* marker = new QwtPolarMarker();
    marker->setPosition( QwtPointPolar( 57.3, 4.72 ) );
    marker->setSymbol( new QwtSymbol( QwtSymbol::Ellipse,
        QBrush( Qt::white ), QPen( Qt::green ), QSize( 9, 9 ) ) );
    marker->setLabelAlignment( Qt::AlignHCenter | Qt::AlignTop );

    QwtText text( "Marker" );
    text.setColor( Qt::black );
    QColor bg( Qt::white );
    bg.setAlpha( 200 );
    text.setBackgroundBrush( QBrush( bg ) );

    marker->setLabel( text );
    marker->attach( g_plot );

    QwtLegend* legend = new QwtLegend;
    g_plot->insertLegend( legend,  QwtPolarPlot::BottomLegend );
}

PolarPlotWidget::~PolarPlotWidget()
{
    delete ui;
}
相关推荐
徒步僧2 小时前
ThingsBoard规则链节点:RPC Call Reply节点详解
qt·microsoft·rpc
清灵xmf2 小时前
在 Vue 中实现与优化轮询技术
前端·javascript·vue·轮询
大佩梨2 小时前
VUE+Vite之环境文件配置及使用环境变量
前端
GDAL2 小时前
npm入门教程1:npm简介
前端·npm·node.js
小白白一枚1113 小时前
css实现div被图片撑开
前端·css
可峰科技3 小时前
斗破QT编程入门系列之一:认识Qt:初步使用(四星斗师)
开发语言·qt
我喜欢就喜欢3 小时前
基于qt vs下的视频播放
开发语言·qt·音视频
薛一半3 小时前
PC端查看历史消息,鼠标向上滚动加载数据时页面停留在上次查看的位置
前端·javascript·vue.js
@蒙面大虾3 小时前
CSS综合练习——懒羊羊网页设计
前端·css
MarcoPage3 小时前
第十九课 Vue组件中的方法
前端·javascript·vue.js