QCustomPlot配置可以参考QCustomplot(零)QCustomPlot官方Demo使用。简单来说就是两步:

  • 添加QCustomPlot源文件和头文件
  • ui界面文件中添加QWidget并提升为QCustomPlot

PS:如果你使用的是QT5,需要加上printsupport模块,方法是:QT +=printsupport。话不多说,开始画图吧!

一、配置QCustomPlot类环境

以下的配置是QT5版本的配置过程。

1.1 新建工程并添加printsupport


按默认的一直按下去就好了。在pro文件中找到QT变量,在QWidget后面加上printsupport模块。

1.2 添加源文件和头文件

添加QCustomPlot类的头文件和源文件是必要的,拷贝qcustomplot.h和qcustomplot.cp文件到工程目录下(pro同级目录),右键工程选择Add Exsisting Files...将刚刚拷贝的两个文件纳入到工程树下:

如果你习惯用pro文件编辑,可以:在pro文件夹中找到SOURCES和HEADERS变量,增加两个文件qcustomplot.cpp qcustomplot.h,效果一样。

至此你的pro文件内容至少有以下红色圈圈的内容:

1.3 ui文件增加QWidget并提升成QCustomPlot

点开ui设计师界面,在Container里面找到Widget,这个空间将会作为画图区域,按照需要调整大小:

这样一来只剩下最后一步,将QWidget提升成QCustomPlot。方法是右键QWidget在弹出的窗口中选择promote,选择QCustomPlot头文件路径及类名称后点击提升,至此QCustomPlot配置已经全部配置完成。

二、QCustomPlot几个重要的类

先掌握几个术语: plot 绘制 graph 曲线图 legend 曲线备注 axis(axes) 轴。PS:构造一个默认的QCustomPlot通常会有几个预定义好的对象,方便我们快速更改我们的绘图外观:

2.1 QCPGraph 曲线

QCPGraph表示一个曲线,常见的方法有:

  • QCustomPlot::addGraph 增加一个曲线(一个曲线就需要手动addGraph);
  • QCustomPlot::graph 获得曲线实例;
  • setData/addData 设置/增加曲线数据;
  • setName 设置曲线名称,会在Legend显示的时候用到;
  • rescaleAxes 根据当前数据调整轴范围;(很有用啊)
  • data 返回一个指向曲线数据的指针,可用于直接修改数据;

注意:QCPGraph只能用于一对一的数据,椭圆的曲线方程就不是一对一的,这时候你需要用到另一个类:QCPCurve

借助一些辅助类,你可以描述和控制曲线的表现。

  • setLineStyle 线型,接受一个enum QCP::LineStyle控制线形,可以看附图1;
  • setScatterStyle 散点型,接受一个enum QCPScatterStyle::ScatterShape控制散点形状,可以看附图2;
  • setPen 设置绘制方法,接受一个enum Qt::pen控制绘制线时候的外观,如虚线、颜色、宽度、笔划之间的连接方法,详细可见Qt::pen,附录3。
  • setBrush 设置曲线与坐标轴填充方法,接受一个enum Qt::BrushStyle,见附图4,详细可见Qt::Brush;

2.2 QCPAxisRect (矩形)轴

表示轴系统上的所有设置,如刻度,范围等。一般来说我们不需要直接构造这样一个轴,因为QCustomPlot已经默认构造了四个轴,分别位于上(QCustomPlot::xAxis2)下(QCustomPlot::xAxis1)左(QCustomPlot::yAxis)右(QCustomPlot::yAxis2)四个方位,默认显示左下两个轴。我们可以设置轴上的表现:

标签之间的空白也可以进行控制:

2.3 QCPLegend 图线说明

QCustomPlot默认有成员QCustomPlot::legend实例(调用setVisible(true)显示),一般不需要自己构造QCPLengend,通过这个类你可以控制曲线说明的大小、颜色等属性,好像没有找到位置,找到了再回来补充吧。

三、开始画图!

直接在mainwindow.h中画图了。我们的目标是画一个正弦曲线:

#include <cmath>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QVector<double> x,y;for(double xi=-2*M_PI;xi<2*M_PI;xi+=0.1){x.push_back(xi);y.push_back(sin(xi));}this->ui->qcw_show->addGraph(0);this->ui->qcw_show->graph(0)->setData(x,y);
}

运行后的结果如下:

上面的图有以下问题:

  • 坐标系范围与数据不匹配。定义域应该是[−2π,2π][-2\pi,2\pi][−2π,2π]事实上只显示了[0,5][0,5][0,5];值域是[−1,1][-1,1][−1,1],事实上是[0,5][0,5][0,5]
  • 坐标轴没有名称
  • 曲线没有名称

让这个曲线调整最佳轴属性(如范围、单位长度等)

this->ui->qcw_show->graph(0)->rescaleAxes();//立即适应当前数据

曲线显示图说明、轴标签

for(double xi=-2*M_PI;xi<2*M_PI;xi+=0.1)
{x.push_back(xi);y.push_back(sin(xi));
}
this->ui->qcw_show->addGraph(0);
this->ui->qcw_show->graph(0)->setData(x,y);
this->ui->qcw_show->graph(0)->setName("y=sin(
this->ui->qcw_show->rescaleAxes(true);
this->ui->qcw_show->xAxis->setLabel("X");
this->ui->qcw_show->yAxis->setLabel("Y");
this->ui->qcw_show->legend->setVisible(true);

最终的效果如下:

PS:QCustomPlot本身可以设置交互行为,如放大,缩小移动,选择曲线交互,方法是:customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables);。这个还蛮实用的,不妨试试!


附图1:

附图2

附图3

QCustomPlot (一) 画一个简单正弦曲线相关推荐

  1. Directx11教程(6) 画一个简单的三角形(2)

    在上篇教程中,我们实现了在D3D11中画一个简单的三角形,但是,当我们改变窗口大小时候,三角形形状却随着窗口高宽比例改变而改变,如下图所示: 这是因为我们改变了窗口大小,但后缓冲大小在程序初始化时候, ...

  2. 用ggplot包画一个简单饼图

    用ggplot包画一个简单饼图 首先用library函数加载ggplot2包 1 2 3 4 library(ggplot2) library(dplyr) library(tidyr) librar ...

  3. c语言编程坦克图案,用C语言的图像函数画一个简单的坦克图样

    用C语言的图像函数画一个简单的坦克图样 #include "graphics.h" #include "conio.h" void Tanke(int x,in ...

  4. 如何画一个简单的波特图(渐近线近似零极点特性)?

    如何画一个简单的波特图(渐近线近似&零极点特性)? 在工程上我们常见下图所示的波特图来描述一个系统开环函数的频率特性,通过零点和极点画出波特图我们可以得到系统是否稳定的结论. 首先讲一下人们为 ...

  5. 用python画一个简单的等边三角形

    用python画一个简单的等边三角形 用python画一个简单的等边三角形,源码如下: from turtle import* speed(10) bgcolor("blue") ...

  6. 【python10个小实验】1. 画一个简单的三角形

    对于如何编程入门,不少人都有自己的一套方法. 从我个人的角度来说,从一个个小的实战中锻炼,不失为一个好方法. 本系列,我将带大家来做10个python小实验,通过完成一系列的小目标, 一方面,熟悉py ...

  7. 【SolidWorks】画一个简单的钣金外壳

    今天楼主试着用SolidWorks画了一个简单的钣金外壳,如下图: 主要目的是学习"钣金"相关操作,以及熟悉"打孔"."镜像"." ...

  8. ikun必学!python 画一个简单的只因

    大家好呀,我是阿潘. 现在有很多虚假的ikun 1.看似维护鸡哥,实则想吃鸡哥下的蛋 每次看到这种网络攻击,鼻子一酸,泪流不止.这个世界太不友善了,真的不知道面对那么多无端的谩骂他是怎么熬过来的.作为 ...

  9. 使用CSS画一个简单的立方体

    用CSS实现一个简单的立方体: 可以使用弹性盒子模型,先对父级div进行立体化(3D)操作,然后对多个子div进行操作(翻转,平移等),还可以给父级div加上CSS动画,使整体更加酷炫. 大体效果如图 ...

最新文章

  1. \r与\n有何差别,编码的时候应该怎样使用
  2. 批处理之判断文件是否存在
  3. linux gz 解压缩
  4. android各版本的sdk区别
  5. OpenOCD 依赖的deb包
  6. 创业码农被公司套路最惨的一次经历
  7. 洛谷P2678 跳石头
  8. 017、Linux下超实用的性能监测工具
  9. 记录一下树莓派开机启动失败 进入紧急模式 原因
  10. CAD学习笔记中级课【参数化】
  11. 学c语言和51单片机的作业,《手把手教你学51单片机(C语言版)》例程和源码
  12. winserve2016 万能驱动网卡_Windows Server 2016中无线网卡驱动问题
  13. 免费股票量化交易软件有哪些?
  14. 计算机插u盘的接口通常是,在计算机上插u盘的接口是什么标准接口
  15. 数学建模之matlab入门篇
  16. 所谓的飞扬档案管理软件
  17. 利用@media与@media screen进行响应式布局
  18. ShowWindow
  19. CF1143F/1142C U2
  20. 精华文章置顶--使用VSCode 进行IRIS 开发

热门文章

  1. Mac,Linux中用mkdir同时创建多个文件夹
  2. Web前端最常用的技能整理,附最新前端学习资料和视频教程
  3. SAP R/3系统技术
  4. 数组截取之 slice() 方法
  5. 爬虫实战(一)—利用requests、mongo、redis代理池爬取英雄联盟opgg实时英雄数据
  6. 电容笔好还是触控笔好?超实惠电容笔排行
  7. 2020-11-19 南京途牛前端现场面试
  8. js复制功能,可粘贴到word,微信等其他地方(复制内容可换行)
  9. 《内网安全攻防:渗透测试实战指南》读书笔记(五):域内横向移动分析及防御
  10. 关于激萌斗地主,关于我们五个