QWT官方例子--barchart

一、运行效果

在这里插入图片描述


二、工程结构

在这里插入图片描述

  • main.cpp中是mainwindow的定义,不赘述;
  • barchart是继承自QwtPlot的视窗类;
  • 多系列柱条形图是:QwtPlotMultiBarChart

三、代码分析

#ifndef _BAR_CHART_H_

#include <qwt_plot.h>

class QwtPlotMultiBarChart;

class BarChart: public QwtPlot
{
    Q_OBJECT

public:
    BarChart( QWidget * = NULL );

public Q_SLOTS:
    void setMode( int );
    void setOrientation( int );
    void exportChart();

private:
    void populate();

    QwtPlotMultiBarChart *d_barChartItem;   //多系列柱条形图
};

#endif

#include "barchart.h"
#include <qwt_plot_renderer.h>
#include <qwt_plot_canvas.h>
#include <qwt_plot_multi_barchart.h>
#include <qwt_column_symbol.h>
#include <qwt_plot_layout.h>
#include <qwt_legend.h>
#include <qwt_scale_draw.h>

BarChart::BarChart( QWidget *parent ):
    QwtPlot( parent )
{
    setAutoFillBackground( true );  //设置自动填充背景

    //设置画布颜色
    setPalette( Qt::white );
    canvas()->setPalette( QColor( "LemonChiffon" ) );

    //设置窗口标题
    setTitle( "Bar Chart" );

    //设置坐标轴名称
    setAxisTitle( QwtPlot::yLeft, "Whatever" );
    setAxisTitle( QwtPlot::xBottom, "Whatever" );

    //实例化多系列柱条形图
    d_barChartItem = new QwtPlotMultiBarChart( "Bar Chart " );
    d_barChartItem->setLayoutPolicy( QwtPlotMultiBarChart::AutoAdjustSamples ); //设置多系列柱条形图布局策略,详见表A
    d_barChartItem->setSpacing( 20 );   //设置间距
    d_barChartItem->setMargin( 3 );     //设置外边距

    d_barChartItem->attach( this );     //多系列柱条形图吸附到画布

    insertLegend( new QwtLegend() );    //插入图例

    populate();
    setOrientation( 0 );

    setAutoReplot( true );
}

void BarChart::populate()
{
    static const char *colors[] = { "DarkOrchid", "SteelBlue", "Gold" };    //条形柱颜色

    const int numSamples = 5;   //样本组数
    const int numBars = sizeof( colors ) / sizeof( colors[0] ); //样本组内条数,3

    QList<QwtText> titles;
    for ( int i = 0; i < numBars; i++ )
    {
        QString title("Bar %1");
        titles += title.arg( i );
    }
    d_barChartItem->setBarTitles( titles ); //设置样本条名称
    d_barChartItem->setLegendIconSize( QSize( 10, 14 ) );   //设置图例图标大小

    for ( int i = 0; i < numBars; i++ )
    {
        QwtColumnSymbol *symbol = new QwtColumnSymbol( QwtColumnSymbol::Box );  //列形标志对象,外形为盒子
        symbol->setLineWidth( 2 );      //设置线宽
        symbol->setFrameStyle( QwtColumnSymbol::Raised );   //设置面板风格:凸起的框架样式
        symbol->setPalette( QPalette( colors[i] ) );    //设置画板颜色

        d_barChartItem->setSymbol( i, symbol ); //给多形状柱条形图设置列性标志
    }
    
    //创建多系列柱条形图数据
    QVector< QVector<double> > series;  //二维数组
    for ( int i = 0; i < numSamples; i++ )  //五组
    {
        QVector<double> values;
        for ( int j = 0; j < numBars; j++ ) //每组三条
            values += ( 2 + qrand() % 8 );

        series += values;
    }

    //设置数据到多系列条形图
    d_barChartItem->setSamples( series );
}

void BarChart::setMode( int mode )
{
    if ( mode == 0 )
    {
        d_barChartItem->setStyle( QwtPlotMultiBarChart::Grouped );  //设置多系列柱条形图风格为每组并排显示
    }
    else
    {
        d_barChartItem->setStyle( QwtPlotMultiBarChart::Stacked );  //设置多系列柱条形图风格为层叠在单个条形图上显示,占比不同
    }
}

void BarChart::setOrientation( int orientation )
{
    QwtPlot::Axis axis1, axis2;

    //根据参数设置条形图的方向
    if ( orientation == 0 )
    {
        axis1 = QwtPlot::xBottom;
        axis2 = QwtPlot::yLeft;

        d_barChartItem->setOrientation( Qt::Vertical );
    }
    else
    {
        axis1 = QwtPlot::yLeft;
        axis2 = QwtPlot::xBottom;

        d_barChartItem->setOrientation( Qt::Horizontal );
    }

    setAxisScale( axis1, 0, d_barChartItem->dataSize() - 1, 1.0 );  //设置坐标轴axis1伸缩,[0,d_barChartItem->dataSize() - 1],步长为1.0
    setAxisAutoScale( axis2 );  //自动缩放坐标轴axis2,条形图的纵轴

    //坐标轴右三个组件组成:骨架(Backbone)、刻度(Ticks)、示数(Labels)
    //axis1作为横轴只需要显示数字分组即可,故禁用骨架和刻度;
    //axis2作为纵轴,需要显示读数,故使能骨架和刻度;
    QwtScaleDraw *scaleDraw1 = axisScaleDraw( axis1 );  //根据坐标轴ID获取坐标轴
    scaleDraw1->enableComponent( QwtScaleDraw::Backbone, false );   //禁用axis1的骨架
    scaleDraw1->enableComponent( QwtScaleDraw::Ticks, false );  //禁用axis1的刻度

    QwtScaleDraw *scaleDraw2 = axisScaleDraw( axis2 );  //根据坐标轴ID获取坐标轴
    scaleDraw2->enableComponent( QwtScaleDraw::Backbone, true );    //禁用axis2的骨架
    scaleDraw2->enableComponent( QwtScaleDraw::Ticks, true );   //禁用axis2的刻度

    plotLayout()->setAlignCanvasToScale( axis1, true ); //为指定的轴线设置排列画布到轴线比例尺,?
    plotLayout()->setAlignCanvasToScale( axis2, false );

    plotLayout()->setCanvasMargin( 100 ); //设置QWtPlot画布外边距为0
    updateCanvasMargins();

    replot();
}

void BarChart::exportChart()
{
    QwtPlotRenderer renderer;   //打印画布到barchart.pdf
    renderer.exportTo( this, "barchart.pdf" );
}


表A

LayoutPolicy说明
AutoAdjustSamples样本宽度是通过将边界矩形除以样本数来计算的。 layoutHint() 用作绘制设备坐标中的最小宽度。
ScaleSamplesToAxeslayoutHint() 定义轴坐标的间隔
ScaleSampleToCanvas通过将 layoutHint() 与画布的高度或宽度相乘来计算条形宽度
FixedSampleSizelayoutHint() 定义了绘制设备坐标中的固定宽度
请添加图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝勒里恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值