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

相关文章

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

SpringBoot请求参数传递与接收示例详解

《SpringBoot请求参数传递与接收示例详解》本文给大家介绍SpringBoot请求参数传递与接收示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录I. 基础参数传递i.查询参数(Query Parameters)ii.路径参数(Path Va

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

Java中的stream流分组示例详解

《Java中的stream流分组示例详解》Java8StreamAPI以函数式风格处理集合数据,支持分组、统计等操作,可按单/多字段分组,使用String、Map.Entry或Java16record... 目录什么是stream流1、根据某个字段分组2、按多个字段分组(组合分组)1、方法一:使用 Stri

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Java利用@SneakyThrows注解提升异常处理效率详解

《Java利用@SneakyThrows注解提升异常处理效率详解》这篇文章将深度剖析@SneakyThrows的原理,用法,适用场景以及隐藏的陷阱,看看它如何让Java异常处理效率飙升50%,感兴趣的... 目录前言一、检查型异常的“诅咒”:为什么Java开发者讨厌它1.1 检查型异常的痛点1.2 为什么说

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum