QCustomplot - 6.QCustomplot详解-程序员宅基地

技术标签: 曲线  qt  QCustomplot  

一.QCustomplot

这个类是此库的核心类,所有的一切操作都会在这上面运行。

二.常用的接口

1.设置背景图片

void setBackground (const QPixmap &pm)

2.添加图层、删除图层、清空graphs并释放资源

QCPGraph *addGraph(QCPAxis *keyAxis=nullptr, QCPAxis *valueAxis=nullptr)

bool removeGraph (QCPGraph *graph)

int clearGraphs()

3.删除item、清空items并释放资源

bool removeItem (QCPAbstractItem *item)
int clearItems ()

4.保存内容,支持保存pdf、png、jpg、bmp格式

bool savePdf (const QString &fileName, int width=0, int height=0, QCP::ExportPen exportPen=QCP::epAllowCosmetic, const QString &pdfCreator=QString(), const QString &pdfTitle=QString())
 
bool savePng (const QString &fileName, int width=0, int height=0, double scale=1.0, int quality=-1, int resolution=96, QCP::ResolutionUnit resolutionUnit=QCP::ruDotsPerInch)
 
bool saveJpg (const QString &fileName, int width=0, int height=0, double scale=1.0, int quality=-1, int resolution=96, QCP::ResolutionUnit resolutionUnit=QCP::ruDotsPerInch)
 
bool saveBmp (const QString &fileName, int width=0, int height=0, double scale=1.0, int resolution=96, QCP::ResolutionUnit resolutionUnit=QCP::ruDotsPerInch)

5.清空布局

customPlot->plotLayout()->clear();

6.添加布局

  QCPLayoutGrid *subLayout = new QCPLayoutGrid;
 
  customPlot->plotLayout()->addElement(1, 0, subLayout);

7.背景设置渐变色

  QLinearGradient plotGradient;
  plotGradient.setStart(0, 0);
  plotGradient.setFinalStop(0, 350);
  plotGradient.setColorAt(0, QColor(80, 80, 80));
  plotGradient.setColorAt(1, QColor(50, 50, 50));
  customPlot->setBackground(plotGradient);

8.设置可拖动和滚轮放大缩小

customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);

9.缩放坐标轴,使图形中的项都可见

void QCustomPlot::rescaleAxes(bool  onlyVisiblePlottables = false)

10.重绘,相当于QWidget的update(),当需要清空所有graph或者items时,调用一下replot。

customPlot->replot()

11.设置图例位置

customPlot->axisRect()->insetLayout()->setInsetAlignment(0, Qt::AlignLeft | Qt::AlignTop);

12.设置title

  customPlot->plotLayout()->insertRow(0);
  customPlot->plotLayout()->addElement(0, 0, new QCPTextElement(customPlot, "Regenerative Energies", QFont("sans", 12, QFont::Bold)));

 

三.示例

自定义一个布局

源码:

//清空布局,准备自己定义
    ui->customPlot->plotLayout()->clear();

    //自己定义一个QCPAxisRect
    QCPAxisRect *wideAxisRect = new QCPAxisRect(ui->customPlot);
    wideAxisRect->setupFullAxesBox(true);
    wideAxisRect->axis(QCPAxis::atRight, 0)->setTickLabels(true);
    wideAxisRect->addAxis(QCPAxis::atLeft)->setTickLabelColor(QColor("#6050F8"));

    //自定义一个网格布局
    QCPLayoutGrid *subLayout = new QCPLayoutGrid;

    //0行0列插入wideAxisRect
    ui->customPlot->plotLayout()->addElement(0, 0, wideAxisRect);

    //1行0列插入subLayout
    ui->customPlot->plotLayout()->addElement(1, 0, subLayout);

    //subLayout中准备子QCPAxisRect
    QCPAxisRect *subRectLeft = new QCPAxisRect(ui->customPlot, false);
    QCPAxisRect *subRectRight = new QCPAxisRect(ui->customPlot, false);

    //在subLayout中进入布局,添加元素
    subLayout->addElement(0, 0, subRectLeft);
    subLayout->addElement(0, 1, subRectRight);

    subRectRight->setMaximumSize(100, 100);
    subRectRight->setMinimumSize(100, 100);

    //添加坐标轴(左轴和底部轴)
    subRectLeft->addAxes(QCPAxis::atBottom | QCPAxis::atLeft);

    //添加坐标轴右轴和底部轴)
    subRectRight->addAxes(QCPAxis::atBottom | QCPAxis::atRight);

    //设置tickCount数量
    subRectLeft->axis(QCPAxis::atLeft)->ticker()->setTickCount(2);
    subRectRight->axis(QCPAxis::atRight)->ticker()->setTickCount(2);
    subRectRight->axis(QCPAxis::atBottom)->ticker()->setTickCount(2);

    //设置网格可见
    subRectLeft->axis(QCPAxis::atBottom)->grid()->setVisible(true);

    //同步上下轴矩形的左右边距
    QCPMarginGroup *marginGroup = new QCPMarginGroup(ui->customPlot);
    subRectLeft->setMarginGroup(QCP::msLeft, marginGroup);
    subRectRight->setMarginGroup(QCP::msRight, marginGroup);
    wideAxisRect->setMarginGroup(QCP::msLeft | QCP::msRight, marginGroup);

    //移动新创建的坐标轴到“axes”层,移动网格到“grid”层
    foreach (QCPAxisRect *rect, ui->customPlot->axisRects())
    {
      foreach (QCPAxis *axis, rect->axes())
      {
        axis->setLayer("axes");
        axis->grid()->setLayer("grid");
      }
    }

    //准备数据
    QVector<QCPGraphData> dataCos(21), dataGauss(50), dataRandom(100);
    QVector<double> x3, y3;
    std::srand(3);
    for (int i=0; i<dataCos.size(); ++i)
    {
      dataCos[i].key = i/(double)(dataCos.size()-1)*10-5.0;
      dataCos[i].value = qCos(dataCos[i].key);
    }
    for (int i=0; i<dataGauss.size(); ++i)
    {
      dataGauss[i].key = i/(double)dataGauss.size()*10-5.0;
      dataGauss[i].value = qExp(-dataGauss[i].key*dataGauss[i].key*0.2)*1000;
    }
    for (int i=0; i<dataRandom.size(); ++i)
    {
      dataRandom[i].key = i/(double)dataRandom.size()*10;
      dataRandom[i].value = std::rand()/(double)RAND_MAX-0.5+dataRandom[qMax(0, i-1)].value;
    }
    x3 << 1 << 2 << 3 << 4;
    y3 << 2 << 2.5 << 4 << 1.5;

    //创建图层1
    QCPGraph *mainGraphCos = ui->customPlot->addGraph(wideAxisRect->axis(QCPAxis::atBottom), wideAxisRect->axis(QCPAxis::atLeft));
    mainGraphCos->data()->set(dataCos);
    mainGraphCos->valueAxis()->setRange(-1, 1);
    mainGraphCos->rescaleKeyAxis();
    mainGraphCos->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, QPen(Qt::black), QBrush(Qt::white), 6));
    mainGraphCos->setPen(QPen(QColor(120, 120, 120), 2));

    //创建图层2
    QCPGraph *mainGraphGauss = ui->customPlot->addGraph(wideAxisRect->axis(QCPAxis::atBottom), wideAxisRect->axis(QCPAxis::atLeft, 1));
    mainGraphGauss->data()->set(dataGauss);
    mainGraphGauss->setPen(QPen(QColor("#8070B8"), 2));
    mainGraphGauss->setBrush(QColor(110, 170, 110, 30));
    mainGraphCos->setChannelFillGraph(mainGraphGauss);
    mainGraphCos->setBrush(QColor(255, 161, 0, 50));
    mainGraphGauss->valueAxis()->setRange(0, 1000);
    mainGraphGauss->rescaleKeyAxis();

    //创建图层3
    QCPGraph *subGraphRandom = ui->customPlot->addGraph(subRectLeft->axis(QCPAxis::atBottom), subRectLeft->axis(QCPAxis::atLeft));
    subGraphRandom->data()->set(dataRandom);
    subGraphRandom->setLineStyle(QCPGraph::lsImpulse);
    subGraphRandom->setPen(QPen(QColor("#FFA100"), 1.5));
    subGraphRandom->rescaleAxes();

    //这是条形统计图
    QCPBars *subBars = new QCPBars(subRectRight->axis(QCPAxis::atBottom), subRectRight->axis(QCPAxis::atRight));
    subBars->setWidth(3/(double)x3.size());
    subBars->setData(x3, y3);
    subBars->setPen(QPen(Qt::black));
    subBars->setAntialiased(false);
    subBars->setAntialiasedFill(false);
    subBars->setBrush(QColor("#705BE8"));
    subBars->keyAxis()->setSubTicks(false);
    subBars->rescaleAxes();

    //为subBars键轴设置一个只给出整数刻度的ticker
    QSharedPointer<QCPAxisTickerFixed> intTicker(new QCPAxisTickerFixed);
    intTicker->setTickStep(1.0);
    intTicker->setScaleStrategy(QCPAxisTickerFixed::ssMultiples);

    subBars->keyAxis()->setTicker(intTicker);

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wzz953200463/article/details/123854172

智能推荐

Mysql学习_InnoDB On-Disk Structures_TABLE_mysql table is disabled-程序员宅基地

文章浏览阅读409次。InnoDB On-Disk StructuresTableCreating InnoDB Tables:CREATE TABLE t1 (a INT, b CHAR (20), PRIMARY KEY (a)) ENGINE=InnoDB;You do not need to specify the ENGINE=InnoDB clause if InnoDB is defined ..._mysql table is disabled

bzoj3296: [USACO2011 Open] Learning Languages(并查集)-程序员宅基地

文章浏览阅读248次。题目传送门 。解法: 并查集。 一头牛连向他能说的语言。 然后可以通过翻译的话就相当于双向边咯。 意思就是牛可以去找语言,语言也可以找牛。 最后记录有多少个不同的集合-1即可代码实现:#include&lt;cstdio&gt;#include&lt;cstring&gt;#include&lt;cstdlib&gt;#include&lt;iostream&gt..._bzoj3296

无线接入认证web服务器搭建,基于WEB和RADIUS的无线局域网接入认证系统-程序员宅基地

文章浏览阅读1.2k次。摘要:无线局域网的安全运营管理是近年的研究热点,而用户的接入认证是网络安全管理和运营的基础.常见的接入认证技术有PPPoE,IEEE 802.1x和Web认证三种.本文针对无线局域网的特点,以用户进行认证的便利性和易于维护性为依据,致力于开发基于WEB和RADIUS(远端拨入用户认证服务)的接入认证系统. 论文首先进行WEB认证系统总体设计,选择Linux作为开发环境.通过深入剖析Netfilte..._wifi web认证服务器搭建

解决conda 安装时的HTTP报错CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs_linux conda 报错 condahttperror: http 000 connection-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。错误代码:CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/linux-64/current_repodata.json>Elapsed: -An HTTP error occurred when trying to retrieve this URL.HTTP errors are often intermittent, and a simple retry _linux conda 报错 condahttperror: http 000 connection failed for url <>

linux终端声音设置,终端命令设置音量?-程序员宅基地

文章浏览阅读510次。问题描述我有一个外部声卡,大部分工作正常,除了第一次插入时或打开笔记本电脑时,音量设置为100%。也就是整个系统音量,如声音指示器所示。我正在寻找的是一个终端命令,将该音量设置为50%,这样我就可以在登录时运行它,而不必担心如果我忘记了转动,我播放的第一个音频会在我身上发出声音音量降低。哪些命令允许您更改该音量,即声音指示器中的音量?我用gsettings和dbus四处探索,但一直无法找到任何可以..._amixer -q -d pulse sset master 5%- unmute

form表单,formdata对象,实现文件上传_formdata文件上传-程序员宅基地

文章浏览阅读3.1k次。action提交表单时,向何处发送表单数据target在何处打开url_blank在新窗口打开_self在同一个窗口打开默认_parent_topmethod属性以何种方式把表单数据提交到actionurlGET/POSTenctype属性发送表单数据之前如何对数据进行编码——上传图片post......_formdata文件上传

随便推点

android Listview 软引用SoftReference异步加载图片_listview软引用-程序员宅基地

文章浏览阅读1.9k次。网上软应用的例子很多,我也是借鉴别人修改了下,推荐一个网址:http://www.iteye.com/topic/685986 之前总是不太理解,今天认真的推敲下,记录下来方便以后用到. HashMap> imageCache 关于SoftReference这个类多少知道些机制,会用就ok了。 机制:简单来说,她会帮助我们管理内存,防止内存溢出,另外一点也_listview软引用

spark1.0-集群搭建_e5 2690-程序员宅基地

文章浏览阅读832次。背景机器环境:部门有10台服务器,每台配置为:intel E5-2690 v3 48核,775Gb内存。搭建了hdfs,hive,spark,并且spark的资源调度方案为yarn模式。因为资源分配有限。故而在自己组所拥有的6台服务器上,手动搭建spark集群,每台配置为:intel E5-2670 v3 48核,128Gb内存,18T硬盘(一个驱动控制器口)。 任务:20T压缩包(压缩率3左右,_e5 2690

《自然语言处理:数字化时代的语言智慧》_体系化智能nlp-程序员宅基地

文章浏览阅读1.1k次,点赞45次,收藏31次。随着数字化时代的来临,自然语言处理(NLP)技术正在成为信息处理和人机交互的核心技术之一。本文将围绕NLP的技术进展、技术原理、行业应用案例、面临的挑战与机遇以及未来趋势进行详细探讨。_体系化智能nlp

Python 3+Django 3 结合Vue.js框架构建前后端分离Web开发平台实战-程序员宅基地

文章浏览阅读3k次,点赞2次,收藏35次。学习全文大概需要 12分钟,内容实战性较强。1. 前言本篇将基于Python 3.7+Django 3.0结合Vue.js前端框架,为大家介绍如何基于这三者的技术栈来实现一个前端后离的W..._python+django+mysql+vue前后端分离开发的小型电子商务管理系统

flutter框架简单学习_flutter框架语法学习-程序员宅基地

文章浏览阅读269次。flutter框架最近在搞大创,主要课题就是flutter开发,简单认识一下本文将widget称为控件项目开篇介绍一个Flutter项目从main函数中的runApp调用开始。在ranApp函数中所接收的控件会成为整个屏幕的根控件,并覆盖在整个屏幕。(可以将这个控件理解成iOS中的rootViewController或android中在manifest文件中配置的mainActivity的界面)。而其他的控件(widget)都是在这个根控件上添加的。import 'package:flutter/_flutter框架语法学习

兼容性测试神器 responsively-app_responsivelyapp-程序员宅基地

文章浏览阅读5.8k次,点赞3次,收藏11次。官网 https://responsively.app/下载地址 https://github.com/manojVivek/responsively-app/releases当时v0.1.6,DIY设备信息后,不然新设备不会显示,还自动添加所有默认设备。几十个设备一起添加到首页,当时我的电脑直接蜂鸣了。。目前版本v0.2.0,v0.1.6那个致命bug终于修复了。自定义设备只需要填写相关信息就可以了,User-Agent可以从浏览器Copy过来比较真实。..._responsivelyapp