Qwt QwtLegend和QwtPlotLegendItem图例类详解

2023-10-28 02:20

本文主要是介绍Qwt QwtLegend和QwtPlotLegendItem图例类详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.概述

QwtLegend类是Qwt绘图库中用于显示图例的类。图例用于标识不同曲线、绘图元素或数据的意义,以便用户能够更好地理解图表中的数据。通过QwtLegend类,可以方便地在图表中添加、删除和设置图例的位置、方向和样式等属性。

QwtPlotLegendItem类是Qwt绘图库中用于在绘图中添加图例项的类。与QwtLegend类不同,QwtPlotLegendItem类是将图例项直接添加到绘图中,而不是作为独立的图例显示。可以将QwtPlotLegendItem对象与绘图对象相关联,以便在绘图中显示图例项。 

2. 常用方法

QwtPlotLegendItem常用方法介绍

设置最大列数

void setMaxColumns (uint)

设置对齐方式

void setAlignmentInCanvas (Qt::Alignment)

设置背景模式

void setBackgroundMode (BackgroundMode)

设置边框圆角

void setBorderRadius (double)

设置字体

void setFont (const QFont &)

设置外边距

void setItemMargin (int)void setMargin (int)

设置距离

void setItemSpacing (int)void setSpacing (int)

3.示例

源码:

//LegendWidget.h
#ifndef LEGENDWIDGET_H
#define LEGENDWIDGET_H#include <QWidget>namespace Ui {
class LegendWidget;
}class QwtLegend;
class QwtPlotLegendItem;class Settings
{public:Settings(){legend.isEnabled = false;legend.position = 0;legendItem.isEnabled = false;legendItem.numColumns = 0;legendItem.alignment = 0;legendItem.backgroundMode = 0;legendItem.size = 12;curve.numCurves = 0;curve.title = "Curve";}struct{bool isEnabled;int position;} legend;struct{bool isEnabled;int numColumns;int alignment;int backgroundMode;int size;} legendItem;struct{int numCurves;QString title;} curve;
};class LegendWidget : public QWidget
{Q_OBJECTpublic:explicit LegendWidget(QWidget *parent = 0);~LegendWidget();private:Settings settings() const;void applySettings( const Settings& );void insertCurve();private slots:void on_cboxLegendEnabled_stateChanged(int arg1);void on_cbxPos_currentIndexChanged(int index);void on_cboxLegendItemEnabled_stateChanged(int arg1);void on_cbxHorizontal_currentIndexChanged(int index);void on_cbxVertical_currentIndexChanged(int index);void on_cbxBackGround_currentIndexChanged(int index);void on_spinBoxSize_valueChanged(int arg1);void on_spinBoxNum_valueChanged(int arg1);void on_leTitle_textEdited(const QString &arg1);private Q_SLOTS:void edited();void on_spinBoxColumns_valueChanged(int arg1);private:QwtLegend* m_externalLegend = nullptr;QwtPlotLegendItem* m_legendItem = nullptr;bool m_isDirty = false;private:Ui::LegendWidget *ui;
};#endif // LEGENDWIDGET_H#include "LegendWidget.h"
#include "ui_LegendWidget.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"class Curve : public QwtPlotCurve
{public:Curve( int index ):m_index( index ){setRenderHint( QwtPlotItem::RenderAntialiased );initData();}void setCurveTitle( const QString& title ){QString txt("%1 %2");setTitle( QString( "%1 %2" ).arg( title ).arg( m_index ) );}void initData(){QVector< QPointF > points;double y = qwtRand() % 1000;for ( double x = 0.0; x <= 1000.0; x += 100.0 ){double off = qwtRand() % 200 - 100;if ( y + off > 980.0 || y + off < 20.0 )off = -off;y += off;points += QPointF( x, y );}setSamples( points );}private:const int m_index;
};class LegendItem : public QwtPlotLegendItem
{public:LegendItem(){setRenderHint( QwtPlotItem::RenderAntialiased );const QColor c1( Qt::white );setTextPen( c1 );setBorderPen( c1 );QColor c2( Qt::gray );c2.setAlpha( 200 );setBackgroundBrush( c2 );}
};QwtPlot *g_plot = nullptr;LegendWidget::LegendWidget(QWidget *parent) :QWidget(parent),ui(new Ui::LegendWidget)
{ui->setupUi(this);QwtPlotCanvas* canvas = new QwtPlotCanvas();canvas->setFocusIndicator( QwtPlotCanvas::CanvasFocusIndicator );canvas->setFocusPolicy( Qt::StrongFocus );canvas->setPalette( Qt::black );//创建plotg_plot = new QwtPlot(QwtText("图列示例"),this);g_plot->setFooter( "Footer" );g_plot->setAutoReplot( false );g_plot->setCanvas( canvas );//创建一个网格QwtPlotGrid* grid = new QwtPlotGrid;grid->enableXMin( true );grid->setMajorPen( Qt::gray, 0, Qt::DotLine );grid->setMinorPen( Qt::darkGray, 0, Qt::DotLine );grid->attach( g_plot );//设置坐标轴范围g_plot->setAxisScale( QwtAxis::YLeft, 0.0, 1000.0 );g_plot->setAxisScale( QwtAxis::XBottom, 0.0, 1000.0 );ui->hLayout->addWidget(g_plot);//初始化属性Settings settings;settings.legend.isEnabled = true;settings.legend.position = QwtPlot::BottomLegend;settings.legendItem.isEnabled = false;settings.legendItem.numColumns = 1;settings.legendItem.alignment = Qt::AlignRight | Qt::AlignVCenter;settings.legendItem.backgroundMode = 0;settings.legendItem.size = g_plot->canvas()->font().pointSize();settings.curve.numCurves = 4;settings.curve.title = "曲线";applySettings(settings);
}LegendWidget::~LegendWidget()
{delete ui;
}Settings LegendWidget::settings() const
{Settings s;s.legend.isEnabled =ui->cboxLegendEnabled->checkState() == Qt::Checked;s.legend.position = ui->cbxPos->currentIndex();s.legendItem.isEnabled =ui->cboxLegendItemEnabled->checkState() == Qt::Checked;s.legendItem.numColumns = ui->spinBoxColumns->value();int align = 0;int hIndex = ui->cbxHorizontal->currentIndex();if ( hIndex == 0 )align |= Qt::AlignLeft;else if ( hIndex == 2 )align |= Qt::AlignRight;elsealign |= Qt::AlignHCenter;int vIndex = ui->cbxVertical->currentIndex();if ( vIndex == 0 )align |= Qt::AlignTop;else if ( vIndex == 2 )align |= Qt::AlignBottom;elsealign |= Qt::AlignVCenter;s.legendItem.alignment = align;s.legendItem.backgroundMode =ui->cbxBackGround->currentIndex();s.legendItem.size = ui->spinBoxSize->value();s.curve.numCurves = ui->spinBoxNum->value();s.curve.title = ui->leTitle->text();return s;
}void LegendWidget::applySettings(const Settings &settings)
{m_isDirty = false;g_plot->setAutoReplot( true );//判断图列是否启用if ( settings.legend.isEnabled ){//设置图列位置if ( settings.legend.position > QwtPlot::TopLegend ){//如果有,就先删除if ( g_plot->legend() ){// remove legend controlled by the plotg_plot->insertLegend( NULL );}//弹出的图列if ( m_externalLegend == NULL ){m_externalLegend = new QwtLegend();m_externalLegend->setWindowTitle("Plot Legend");connect(g_plot,SIGNAL(legendDataChanged(const QVariant&,const QList<QwtLegendData>&)),m_externalLegend,SLOT(updateLegend(const QVariant&,const QList<QwtLegendData>&)) );m_externalLegend->show();// populate the new legendg_plot->updateLegend();}}else{delete m_externalLegend;m_externalLegend = NULL;if ( g_plot->legend() == NULL ||g_plot->plotLayout()->legendPosition() != settings.legend.position ){g_plot->insertLegend( new QwtLegend(),QwtPlot::LegendPosition( settings.legend.position ) );}}}else{g_plot->insertLegend( NULL );delete m_externalLegend;m_externalLegend = NULL;}//判断图例子项是否启用if ( settings.legendItem.isEnabled ){if ( m_legendItem == NULL ){m_legendItem = new LegendItem();m_legendItem->attach( g_plot );}//设置最大列数m_legendItem->setMaxColumns( settings.legendItem.numColumns );//设置对齐方式m_legendItem->setAlignmentInCanvas( Qt::Alignment( settings.legendItem.alignment ) );//设置背景模式m_legendItem->setBackgroundMode(QwtPlotLegendItem::BackgroundMode( settings.legendItem.backgroundMode ) );if ( settings.legendItem.backgroundMode ==QwtPlotLegendItem::ItemBackground ){m_legendItem->setBorderRadius( 4 );m_legendItem->setMargin( 0 );m_legendItem->setSpacing( 4 );m_legendItem->setItemMargin( 2 );}else{m_legendItem->setBorderRadius( 8 );m_legendItem->setMargin( 4 );m_legendItem->setSpacing( 2 );m_legendItem->setItemMargin( 0 );}//设置字体大小QFont font = m_legendItem->font();font.setPointSize( settings.legendItem.size );m_legendItem->setFont( font );}else{delete m_legendItem;m_legendItem = NULL;}//画曲线QwtPlotItemList curveList = g_plot->itemList( QwtPlotItem::Rtti_PlotCurve );if ( curveList.size() != settings.curve.numCurves ){while ( curveList.size() > settings.curve.numCurves ){QwtPlotItem* curve = curveList.takeFirst();delete curve;}for ( int i = curveList.size(); i < settings.curve.numCurves; i++ )insertCurve();}curveList = g_plot->itemList( QwtPlotItem::Rtti_PlotCurve );for ( int i = 0; i < curveList.count(); i++ ){Curve* curve = static_cast< Curve* >( curveList[i] );curve->setCurveTitle( settings.curve.title );int sz = 0.5 * settings.legendItem.size;curve->setLegendIconSize( QSize( sz, sz ) );}g_plot->setAutoReplot( false );if ( m_isDirty ){m_isDirty = false;g_plot->replot();}
}void LegendWidget::insertCurve()
{static int counter = 1;const char* colors[] ={"LightSalmon","SteelBlue","Yellow","Fuchsia","PaleGreen","PaleTurquoise","Cornsilk","HotPink","Peru","Maroon"};const int numColors = sizeof( colors ) / sizeof( colors[0] );QwtPlotCurve* curve = new Curve( counter++ );curve->setPen( QColor( colors[ counter % numColors ] ), 2 );curve->attach( g_plot );
}void LegendWidget::on_cboxLegendEnabled_stateChanged(int arg1)
{edited();
}void LegendWidget::on_cbxPos_currentIndexChanged(int index)
{edited();
}void LegendWidget::on_cboxLegendItemEnabled_stateChanged(int arg1)
{edited();
}void LegendWidget::on_cbxHorizontal_currentIndexChanged(int index)
{edited();
}void LegendWidget::on_cbxVertical_currentIndexChanged(int index)
{edited();
}void LegendWidget::on_cbxBackGround_currentIndexChanged(int index)
{edited();
}void LegendWidget::on_spinBoxSize_valueChanged(int arg1)
{edited();
}void LegendWidget::on_spinBoxNum_valueChanged(int arg1)
{edited();
}void LegendWidget::on_leTitle_textEdited(const QString &arg1)
{edited();
}void LegendWidget::edited()
{const Settings s = settings();applySettings( s);
}void LegendWidget::on_spinBoxColumns_valueChanged(int arg1)
{edited();
}

4.完整工程

https://download.csdn.net/download/wzz953200463/88479580

此工程不包含qwt的库,需自行编译。

这篇关于Qwt QwtLegend和QwtPlotLegendItem图例类详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/290025

相关文章

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

前端高级CSS用法示例详解

《前端高级CSS用法示例详解》在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交互和动态效果的关键技术之一,随着前端技术的不断发展,CSS的用法也日益丰富和高级,本文将深... 前端高级css用法在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义