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;
}
相关推荐
励志不掉头发的内向程序员6 小时前
【从零写一个CAD 03】三个 double 值得单独一个类吗:把视图变换抽成 View
开发语言·c++·qt·学习·系统架构
FungLeo13 小时前
成为全栈·React 管理后台篇·总复盘:从“接口能调通”到“后台值得使用”
前端·react.js·前端框架·项目复盘·成为全栈
Csvn14 小时前
并发模式:让渲染学会排队、插队和让路
前端
可乐鸡翅yeah_14 小时前
新手梳理:M3U8 线上问题,哪些是前端锅,哪些是后端锅
前端·ios·音视频·实时音视频·m3u8·音视频在线播放
Flynt14 小时前
Linear 用 1000 个 PR 换掉 styled-components,我写了 200 个按钮,把这笔账复现了一遍
前端·css·preact
JavaGuide15 小时前
NVIDIA 又开源了!这次给 AI Agent 加上权限管控
前端·后端
excel15 小时前
prisma 如何处理数据库竞态
前端·数据库·后端
莪_幻尘17 小时前
Skill 体检:30 个 Skill 全凭感觉?体检器先自曝了 8 个“假 0 分
前端·人工智能·llm
风骏时光牛马17 小时前
AI模型综合能力评测:性能、指令遵循与多场景实测对比
前端
Frag0ut17 小时前
Chrome与Chromium内核浏览器在Windows 11上的新特性全景解析
前端·chrome·windows·web安全·chromium·gemini ai·playready drm