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;
}
相关推荐
IT_陈寒15 小时前
Vite 5 实战:7个鲜为人知的配置技巧让构建速度提升200%
前端·人工智能·后端
gg1593572846015 小时前
JavaScript 核心基础
前端·javascript·vue.js
深蓝海拓15 小时前
PySide6从0开始学习的笔记(二十一) 使用loadUi直接加载.ui文件
笔记·python·qt·学习·ui·pyqt
Stanford_110615 小时前
【2026新年启程】学习之路,探索之路,技术之路,成长之路……都与你同行!!!
前端·c++·学习·微信小程序·排序算法·微信开放平台
打小就很皮...15 小时前
网页包装为桌面应用(Nativefier版)
前端·桌面应用·nativefier
自由生长202415 小时前
为什么我们需要流式系统?
前端
北辰alk15 小时前
从零设计一个Vue路由系统:揭秘SPA导航的核心原理
前端·vue.js
鱼鱼块16 小时前
彻底搞懂 React useRef:从自动聚焦到非受控表单的完整指南
前端·react.js·面试
十五年专注C++开发16 小时前
浅谈Qt中的QSql模块整体设计
开发语言·数据库·c++·qt
nwsuaf_huasir16 小时前
积分旁瓣电平-matlab函数
前端·javascript·matlab