QCustomPlot绘图类详解(大白话)

本文假定你会使用Qt开发,但未接触过QCustomPlot绘图类或者是刚接触。

如何往Qt中引入QCustomPlot

  1. 首先,去官网下载最新版本的源码,注意是QCustomPlot.tar.gz这个文件,里面包含源码和示例。实际上,我们只需要qcustomplot.hqcustomplot.h这两个源文件。
    官网下载
  2. 将代码文件拷贝到本地工程,并引入。
    引入源文件
    QCustomPlot需要依赖printsupport模块,如果你是使用QT+VS开发,配置如下:
    Qt+Vs
    如果是Qt Create开发,在.pro文件中添加:QT += QWidget printsupport
  3. 在Qt中新建ui文件,拖拽一个QWidget控件,将其提升为QCustomPlot
    在这里插入图片描述

QCustomPlot常用函数

// 设置背景色
ui.plotWidget->setBackground(QBrush(QColor("#404040")));// 设置X/Y轴的标签
ui.plotWidget->xAxis->setLabel(QStringLiteral("次数"));// 设置X/Y轴标签字体
ui.plotWidget->xAxis->setLabelFont(plotFont);// 设置X/Y轴标签颜色
ui.plotWidget->xAxis->setLabelColor(QColor(Qt::red));// 设置x=0或y=0所在直线的画笔
ui.plotWidget->xAxis->grid()->setZeroLinePen(QPen(QColor(Qt::yellow)));// 设置X/Y轴刻度范围
ui.plotWidget->xAxis->setRange(1, PT_CNT);// 设置X/Y轴刻度数,也就是分为几段
ui.plotWidget->xAxis->ticker()->setTickCount(8);// 设置X/Y轴刻度值文本的颜色
ui.plotWidget->xAxis->setTickLabelColor(QColor(Qt::green));// 设置X/Y轴轴线的画笔
ui.plotWidget->xAxis->setBasePen(QPen(QColor(Qt::white), 2, Qt::SolidLine));// 设置X/Y轴大刻度的画笔,被分段的位置
ui.plotWidget->xAxis->setTickPen(QPen(QColor("#ff00ff")));// 设置X/Y轴小刻度的画笔
ui.plotWidget->xAxis->setSubTickPen(QPen(QColor("#00ffff")));// 设置内部网格线的画笔
ui.plotWidget->xAxis->grid()->setPen(QPen(QColor(Qt::darkRed), 1, Qt::DotLine));// 添加一个图层
ui.plotWidget->addGraph();// 为对应图层添加数据
ui.plotWidget->graph(0)->addData(keys, values);// 为图层设置画笔
ui.plotWidget->graph(0)->setPen(QColor(Qt::blue));// 设置是/否抗锯齿
ui.plotWidget->graph(0)->setAntialiasedFill(true);// 刷新绘图,更改数据后需手动刷新(缩放会自动刷新)
ui.plotWidget->replot();// 支持拖拽和缩放
ui.plotWidget->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);

绘制直方图

更改QCustomPlot相关属性,这里以颜色修改为主(稍有点乱哈),创建距离-测距次数的直方图。
在这里插入图片描述
相关代码如下:

void PlotTest::InitForm()
{ui.plotWidget->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);ui.plotWidget->setBackground(QBrush(QColor("#404040")));ui.plotWidget->xAxis->setLabel(QStringLiteral("次数"));ui.plotWidget->yAxis->setLabel(QStringLiteral("距离(cm)"));QFont plotFont = font();plotFont.setPointSizeF(10.0);ui.plotWidget->xAxis->setLabelFont(plotFont);ui.plotWidget->yAxis->setLabelFont(plotFont);ui.plotWidget->xAxis->setLabelColor(QColor(Qt::red));ui.plotWidget->yAxis->setLabelColor(QColor(Qt::red));ui.plotWidget->xAxis->grid()->setZeroLinePen(QPen(QColor(Qt::yellow)));ui.plotWidget->yAxis->grid()->setZeroLinePen(QPen(QColor(Qt::yellow)));ui.plotWidget->xAxis->setRange(1, PT_CNT);ui.plotWidget->yAxis->setRange(-10, 90);ui.plotWidget->xAxis->ticker()->setTickCount(8);ui.plotWidget->yAxis->ticker()->setTickCount(8);ui.plotWidget->xAxis->setTickLabelColor(QColor(Qt::green));ui.plotWidget->yAxis->setTickLabelColor(QColor(Qt::green));ui.plotWidget->xAxis->setBasePen(QPen(QColor(Qt::white), 2, Qt::SolidLine));ui.plotWidget->yAxis->setBasePen(QPen(QColor(Qt::white), 2, Qt::SolidLine));ui.plotWidget->xAxis->setTickPen(QPen(QColor("#ff00ff")));ui.plotWidget->yAxis->setTickPen(QPen(QColor("#ff00ff")));ui.plotWidget->xAxis->setSubTickPen(QPen(QColor("#00ffff")));ui.plotWidget->yAxis->setSubTickPen(QPen(QColor("#00ffff")));ui.plotWidget->xAxis->grid()->setPen(QPen(QColor(Qt::darkRed), 1, Qt::DotLine));ui.plotWidget->yAxis->grid()->setPen(QPen(QColor(Qt::darkGreen), 1, Qt::DotLine));QVector<double> keys, values;for (int i = 1; i <= PT_CNT; i++){keys.push_back(i);values.push_back(rand() % 100 - 10);}ui.plotWidget->addGraph();ui.plotWidget->graph(0)->addData(keys, values);ui.plotWidget->graph(0)->setPen(QColor(Qt::blue));ui.plotWidget->graph(0)->setAntialiasedFill(true);ui.plotWidget->replot();
}

刷新直方图

刷新直方图比较简单,刷新指定图层的数据即可。有2种方式:

  • 更换数据
ui.plotWidget->graph(0)->data()->clear(); // 清楚图层对应的数据
ui.plotWidget->graph(0)->addData(keys, values); // 添加新的数据
  • 更换图层
ui.plotWidget->clearGraphs(); // 删除图层(单个或所有)
ui.plotWidget->addGraph(); // 新建图层
ui.plotWidget->graph(0)->addData(keys, values); // 添加新数据

注:两种方式会适用于不同的场景下。
请添加图片描述

绘制连续的直方图

连续直方图可以理解为:不断往图层里添加数据。需要注意的是,每次添加数据都需要更新刻度范围。代码如下:

void PlotTest::DrawContinueGraph()
{QVector<double> keys, values;for (int i = 1; i <= PT_CNT; i++){keys.push_back(mRefreshCnt * PT_CNT + i);values.push_back(rand() % 100 + 1);}ui.plotWidget->graph(0)->addData(keys, values);ui.plotWidget->xAxis->setRange(1, PT_CNT * (mRefreshCnt + 1));ui.plotWidget->graph(0)->setAntialiasedFill(true);ui.plotWidget->replot();mRefreshCnt++;
}

请添加图片描述

完整代码

// PlotTest.h文件
#pragma once#include <QtWidgets/QWidget>
#include "ui_PlotTest.h"class PlotTest : public QWidget
{Q_OBJECTpublic:PlotTest(QWidget *parent = nullptr);~PlotTest();public:void InitForm();            // 初始化控件void DrawStaticGraph();     // 绘制静态库void DrawDynamicGraph();    // 绘制动态库(单图刷新)void DrawContinueGraph();   // 绘制连续图(多图刷新)public slots:void on_btnDynamicDraw_clicked();void on_btnContinueDraw_clicked();private:Ui::PlotTestClass ui;int mRefreshCnt; // 连续刷新次数
};
// PlotTest.cpp文件
#include "PlotTest.h"
#include "CustomPlot\qcustomplot.h"#define PT_CNT       200    // 点数
#define GRAPH_CNT    5      // 图数PlotTest::PlotTest(QWidget *parent): QWidget(parent)
{ui.setupUi(this);InitForm();mRefreshCnt = 1;
}PlotTest::~PlotTest()
{}void PlotTest::on_btnDynamicDraw_clicked()
{ui.btnDynamicDraw->setEnabled(false);ui.btnContinueDraw->setEnabled(false);mRefreshCnt = 1;for (int i = 0; i < 10; i++){DrawDynamicGraph();Sleep(500);}ui.btnDynamicDraw->setEnabled(true);ui.btnContinueDraw->setEnabled(true);
}void PlotTest::on_btnContinueDraw_clicked()
{ui.btnDynamicDraw->setEnabled(false);ui.btnContinueDraw->setEnabled(false);mRefreshCnt = 0;ui.plotWidget->graph(0)->data()->clear();ui.plotWidget->xAxis->setRange(1, PT_CNT);for (int i = 0; i < 10; i++){DrawContinueGraph();Sleep(500);}ui.btnDynamicDraw->setEnabled(true);ui.btnContinueDraw->setEnabled(true);
}void PlotTest::InitForm()
{ui.plotWidget->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);#if 0ui.plotWidget->setBackground(QBrush(QColor("#404040")));ui.plotWidget->xAxis->setLabel(QStringLiteral("次数"));ui.plotWidget->yAxis->setLabel(QStringLiteral("距离(cm)"));QFont plotFont = font();plotFont.setPointSizeF(10.0);ui.plotWidget->xAxis->setLabelFont(plotFont);ui.plotWidget->yAxis->setLabelFont(plotFont);ui.plotWidget->xAxis->setLabelColor(QColor(Qt::red));ui.plotWidget->yAxis->setLabelColor(QColor(Qt::red));ui.plotWidget->xAxis->grid()->setZeroLinePen(QPen(QColor(Qt::yellow)));ui.plotWidget->yAxis->grid()->setZeroLinePen(QPen(QColor(Qt::yellow)));ui.plotWidget->xAxis->setRange(1, PT_CNT);ui.plotWidget->yAxis->setRange(-10, 90);ui.plotWidget->xAxis->ticker()->setTickCount(8);ui.plotWidget->yAxis->ticker()->setTickCount(8);ui.plotWidget->xAxis->setTickLabelColor(QColor(Qt::green));ui.plotWidget->yAxis->setTickLabelColor(QColor(Qt::green));ui.plotWidget->xAxis->setBasePen(QPen(QColor(Qt::white), 2, Qt::SolidLine));ui.plotWidget->yAxis->setBasePen(QPen(QColor(Qt::white), 2, Qt::SolidLine));ui.plotWidget->xAxis->setTickPen(QPen(QColor("#ff00ff")));ui.plotWidget->yAxis->setTickPen(QPen(QColor("#ff00ff")));ui.plotWidget->xAxis->setSubTickPen(QPen(QColor("#00ffff")));ui.plotWidget->yAxis->setSubTickPen(QPen(QColor("#00ffff")));ui.plotWidget->xAxis->grid()->setPen(QPen(QColor(Qt::darkRed), 1, Qt::DotLine));ui.plotWidget->yAxis->grid()->setPen(QPen(QColor(Qt::darkGreen), 1, Qt::DotLine));QVector<double> keys, values;for (int i = 1; i <= PT_CNT; i++){keys.push_back(i);values.push_back(rand() % 100 - 10);}ui.plotWidget->addGraph();ui.plotWidget->graph(0)->addData(keys, values);ui.plotWidget->graph(0)->setPen(QColor(Qt::blue));ui.plotWidget->graph(0)->setAntialiasedFill(true);ui.plotWidget->replot();
#elseui.plotWidget->xAxis->setLabel(QStringLiteral("次数"));ui.plotWidget->yAxis->setLabel(QStringLiteral("距离(cm)"));ui.plotWidget->xAxis->setRange(1, PT_CNT);ui.plotWidget->yAxis->setRange(1, 100);ui.plotWidget->xAxis->ticker()->setTickCount(8);ui.plotWidget->yAxis->ticker()->setTickCount(8);DrawStaticGraph();#endif
}void PlotTest::DrawStaticGraph()
{QVector<double> keys, values;for (int i = 1; i <= PT_CNT; i++){keys.push_back(i);values.push_back(rand() % 100 + 1);}ui.plotWidget->addGraph();ui.plotWidget->graph(0)->addData(keys, values);ui.plotWidget->graph(0)->setPen(QColor(Qt::blue));ui.plotWidget->graph(0)->setAntialiasedFill(true);ui.plotWidget->replot();
}void PlotTest::DrawDynamicGraph()
{ui.plotWidget->clearGraphs();QVector<double> keys, values;for (int i = 1; i <= PT_CNT; i++){keys.push_back(i);values.push_back(rand() % 100 + 1);}ui.plotWidget->addGraph();ui.plotWidget->graph(0)->addData(keys, values);ui.plotWidget->xAxis->setRange(1, PT_CNT);ui.plotWidget->graph(0)->setAntialiasedFill(true);ui.plotWidget->replot();
}void PlotTest::DrawContinueGraph()
{QVector<double> keys, values;for (int i = 1; i <= PT_CNT; i++){keys.push_back(mRefreshCnt * PT_CNT + i);values.push_back(rand() % 100 + 1);}ui.plotWidget->graph(0)->addData(keys, values);ui.plotWidget->xAxis->setRange(1, PT_CNT * (mRefreshCnt + 1));ui.plotWidget->graph(0)->setAntialiasedFill(true);ui.plotWidget->replot();mRefreshCnt++;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/132712.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[学习笔记]CS224W(图机器学习) 2022/2023年冬学习笔记

资料&#xff1a; 课程网址 斯坦福CS224W图机器学习、图神经网络、知识图谱【同济子豪兄】 斯坦福大学CS224W图机器学习公开课-同济子豪兄中文精讲 cs224w&#xff08;图机器学习&#xff09;2021冬季课程学习笔记集合 序言 到图神经网络GCN为止的内容参考了斯坦福CS224W图机…

XUbuntu22.04之查找进程号pidof、pgrep总结(一百九十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

【zlm】 webrtc源码讲解

目录 前端WEB 服务器收到请求 服务端的处理 播放 拉流 参考文章 前端WEB 服务器收到请求 POST /index/api/webrtc?applive&streamtest&typeplay HTTP/1.1 HttpSession::onRecvHeaderHttpSession::Handle_Req_POSTHttpSession::Handle_Req_POSTif (totalConte…

雅思学习总结

#【中秋征文】程序人生&#xff0c;中秋共享# 雅思小科普&#xff1a; 1. 什么是雅思考试&#xff1f; 雅思考试是由&#xff1a;英国文化协会、澳洲 IDP 教育集团、剑桥 大学考试委员会举办的英语水平测试。全称翻译成中文是&#xff1a; 国际英语语言测试系统。 2…

数据库直连提示 No suitable driver found for jdbc:postgresql

背景&#xff1a;我在代码里使用直连的方式在数据库中创建数据库等&#xff0c;由于需要适配各个数据库服务所以我分别兼容了mysql、postgresql、oracal等。但是在使用过程中会出现错误&#xff1a; No suitable driver found for jdbc:postgresql 但是我再使用mysql的直连方式…

片上网络(1)概述

前言 NoC&#xff1a;On-Chip Networks&#xff0c;片上网络。 由于多核乃至众核时代的到来&#xff0c;用于连接它们的可扩展、低延迟、大带宽的通信结构变得至关重要。 在核心较少时&#xff0c;总线Bus和矩阵/交叉开关Crossbar是主要的互联结构。总线可以提供较低的传输延迟…

删除安装Google Chrome浏览器时捆绑安装的Google 文档、表格、幻灯片、Gmail、Google 云端硬盘、YouTube网址链接(Mac)

删除安装Google Chrome浏览器时捆绑安装的Google 文档、表格、幻灯片、Gmail、Google 云端硬盘、YouTube网址链接(Mac) Mac mini操作系统&#xff0c;安装完 Google Chrome 浏览器以后&#xff0c;单击 启动台 桌面左下角的“显示应用程序”&#xff0c;我们发现捆绑安装了 Goo…

docker学习:dockerfile和docker-compose

学习如何使用dockerfile 以下内容&#xff0c;部分来自gpt生成&#xff0c;里面的描述可能会出现问题&#xff0c;但代码部分&#xff0c;我都会进行测试。 1. 需求 对于一个docker&#xff0c;例如python&#xff0c;我们需要其在构建成容器时&#xff0c;就有np。有以下两种方…

【项目实战】【已开源】USB2.0 HUB 集线器的制作教程(详细步骤以及电路图解释)

写在前面 本文是一篇关于 USB2.0 HUB 集线器的制作教程&#xff0c;包括详细的步骤以及电路图解释。 本文记录了笔者制作 USB2.0 HUB 集线器的心路历程&#xff0c;希望对你有帮助。 本文以笔记形式呈现&#xff0c;通过搜集互联网多方资料写成&#xff0c;非盈利性质&#xf…

java 单元测试Junit

所谓单元测试&#xff0c;就是针对最小的功能单元&#xff0c;编写测试代码对其进行正确性测试。为了测试更加方便&#xff0c;有一些第三方的公司或者组织提供了很好用的测试框架&#xff0c;给开发者使用。这里介绍一种Junit测试框架。Junit是第三方公司开源出来的&#xff0…

web系统安全设计原则

一、前言 近日&#xff0c;针对西工大网络被攻击&#xff0c;国家计算机病毒应急处理中心和360公司对一款名为“二次约会”的间谍软件进行了技术分析。分析报告显示&#xff0c;该软件是美国国家安全局&#xff08;NSA&#xff09;开发的网络间谍武器。当下&#xff0c;我们发现…

Spring Boot通过lombok提供的Slf4j省略日志的创建操作

上文 Spring Boot将声明日志步骤抽离出来做一个复用类中 我们写了个创建日志的公开类 但这么简单的东西 自然有人会将它写好 lombok已经 提供出了这个工具 首先 我们需要在 pom.xml 中加上这样一段代码 <dependency><groupId>org.projectlombok</groupId>…

Discourse 如何下载备份并恢复本地数据库

进入网站的备份界面&#xff0c;会看到当前所有的备份情况。 单击下载按钮。 需要注意的是&#xff0c;当你下载后&#xff0c;系统将会发送一个链接到你的邮箱地址中。 你可以使用邮箱地址中收到的链接进行数据下载。 下载链接 单击邮件中收到的下载链接地址进行下载。 下载…

线性代数的本质(九)——二次型与合同

文章目录 二次型与合同二次型与标准型二次型的分类度量矩阵与合同 二次型与合同 二次型与标准型 Grant&#xff1a;二次型研究的是二次曲面在不同基下的坐标变换 由解析几何的知识&#xff0c;我们了解到二次函数的一次项和常数项只是对函数图像进行平移&#xff0c;并不会改变…

下载CentOS ISO镜像 (一)

总目录 https://preparedata.blog.csdn.net/article/details/132877836 文章目录 总目录一、下载CentOS 镜像 一、下载CentOS 镜像 官网下载&#xff1a;https://www.centos.org/download/ Centos Linux 和 CentOS Stream 的区别&#xff1a;https://www.centos.org/cl-vs-cs…

AtCoder Beginner Contest 313 C 一个序列同时加一个数和减一个数,直到最大和最小之间相差最大为1(结论可记住)

AtCoder Beginner Contest 313 C 做题链接&#xff1a;AtCoder Beginner Contest 313 问题陈述 给你一个整数序列 A(A1​,A2​,…,AN​)。你可以执行以下操作任意次数&#xff08;可能为零&#xff09;。 选择带有 1≤i,j≤N的整数 i和 j。将Ai​减少 1&#xff0c;将Aj​增…

图扑可视化图表组件之股票数据分析应用

股市是市场经济的必然产物&#xff0c;在一个国家的金融领域之中有着举足轻重的地位。在过去&#xff0c;人们对于市场走势的把握主要依赖于经验和直觉&#xff0c;往往容易受到主观因素的影响&#xff0c;导致决策上出现偏差。如今&#xff0c;通过数据可视化呈现&#xff0c;…

【C++】多态

目录 1. 多态的概念1.1 概念 2. 多态的定义及实现2.1 多态的构成条件2.2 虚函数2.3 虚函数的重写2.3.1 重写的一些特殊情况 2.4 final和override2.5 重载、覆盖(重写)、隐藏(重定义)的对比 3. 抽象类3.1 概念3.2 实现继承与接口继承 4. 多态的原理4.1 虚函数表4.2 多态的原理4.…

入门人工智能 ——自然语言处理介绍,并使用 Python 进行文本情感分析(5)

入门人工智能 ——自然语言处理介绍&#xff0c;并使用 Python 进行文本情感分析&#xff08;5&#xff09;&#xff09; 入门人工智能 ——自然语言处理介绍&#xff0c;并使用 Python 进行文本情感分析介绍自然语言处理的挑战NLP的基本任务NLP的基本技术NLP的应用领域 使用 P…

《银河麒麟高级服务器操作系统V10》使用

一言而论&#xff1a;讲了麒麟服务器V10的基本使用&#xff0c;包括终端、VNC 文章目录 前言基本架构环境硬件环境软件环境 麒麟安装步骤1.在宿主机上安装好VM&#xff0c;并且激活2.使用VM创建虚拟机3.启动虚拟机 终端常用点VNC的使用麒麟上安装VNC服务器Windows上安装VNC客户…