QCustomplot(五)QCPAxisRect进行子绘图

2023-05-16

子绘图是比较复杂的,你几乎需要掌握QCustomPlot所有类及其含义。那么需要掌握的类有:

  • QCPAxis 描述轴行为,轴需要依赖QCPAxisRect
  • QCPAxisRect 描述矩形区域,区域依赖于QCPCustomPlot
  • QCPLayoutGrid 网格形排列矩形区域,类似于QGridLayout
  • QCustomPlot 默认行为及对象
  • QLegend 图例

1

一、QCPAxis 轴对象

1.1 构造

QCPAxis::QCPAxis (QCPAxisRect * parent, AxisType type);

可以看出QCPAxis依赖与QCPAxisRect对象的,关于第二个参数enum QCPAxis::AxisType,就是表明其在矩形中的位置:

枚举类型编号含义
atLeft0x01Axis is vertical and on the left side of the axis rect
atRight0x02Axis is vertical and on the right side of the axis rect
atTop0x04Axis is horizontal and on the top side of the axis rect
atBottom0x08Axis is horizontal and on the bottom side of the axis rect

1.2 可以设置哪些内容?

构造时用到的两个参数对象是可以返回的:

AxisType axisType () const
QCPAxisRect * axisRect () const

关于网格有以下内容可供设置:
2
关于留白,有以下内容可供设置:
1

二、QCPAxisRec 矩形区域

QCPAxisRect是多个轴围成的一个矩形区域,也就是坐标轴,其构造方法如下:

QCPAxisRect (QCustomPlot *parentPlot, bool setupDefaultAxes=true);

第一个参数是父对象QCustomplot,第二个参数是否设置默认轴(四个轴,但是只显示左下)。构造函数告诉我们,QCPAxisRec必须依赖与一个父对象QCustomPlot。

2.1 SetFullAxesBox 设置完全矩形区域

这个函数为一个矩形区域设置四个默认坐标轴,上下和左右的轴属性完全一样;Tick Label左右默认不显示。

2.2 addAxis和addAxes 添加一个轴

QCPAxis * QCPAxisRect::addAxis (QCPAxis::AxisType type, QCPAxis * axis =nullptr);
QList<QCPAxis *> QCPAxisRect::addAxes(QCPAxis::AxisTypes types);

addAxis函数将往矩形区域特定位置添加一个轴(上下左右),第二个参数是一个QCPAxis对象指针,

  • 轴由内部创建。axis 为空指针,表示由内部创建并维护这个轴的生命周期,请不要直接delete返回的轴指针,而是使用removeAxis删除;
  • 轴是外部实例。axis为指向实例的指针,表示这个轴是用户自行创建的,注意轴类型应该与自行创建的时候一致,否则轴将会添加失败;此外,不应该多次添加同一个轴实例。

无论是内部还是外部,轴生命周期都由QCustomPlot控制,同一个位置可以添加多个轴。

2.3 axis 、axes 方法选取轴实例

  • 特定位置轴个数:int QCPAxisRect::axisCount(QCPAxis type) const返回,
  • 选择某个轴实例可以通过QCPAxis *QCPAxisRect::axis(QCPAxis::AxisType type,int index=0) const
  • 所有轴实例:QList<QCPAxis *> QCPAxisRect::axes(QCPAxis::AxisType types)const
    QList<QCPAxis * > QCPAxisRect::axes ( ) const

那么选取轴实例有什么用呢?答:可以控制轴标签、tick等属性

2.3 removeAxis 移除特定轴

添加好的轴可以通过bool QCPAxisRect:removeAxis(QCPAxis *axis)

三、QCPLayoutGrid 将坐标轴按网格排列

什么是网格布局?网格布局就是将一个子元素按照网格的形状排列。元素对象有:
2

3.1 构造一个QCPLayoutGrid

QCPLayoutGrid::QCPLayoutGrid()

成员函数rowCount和columnCount可以返回当前布局行和列个数。

3.2 addElement 增加一个元素

bool QCPLayoutGrid::addElement(QCPLayoutElement *element);
bool QCPLayoutGrid::addElement(int row,int column,QCPLayoutElement * element);

向布局中增加一个元素,如果对应行列不存在将会扩展它。

3.3 element hasElement 获取一个元素

QCPLayoutElement * QCPLayoutGrid::element(int row,int column) const;
bool QCPLayoutGrid::hasElement(int row,int column);

3.2 simplify、ExpandTo 合并和扩充

void QCPLayoutGrid::expandTo(int newRowCount,int new ColumnCount);
void simplify();

四、QCPLayer 图层

4.1 QCPLayer和QCPLayerable

Layer是可能包含对象的、控制渲染顺序的对象。对于QCustomPlot对象内部具有一个渲染顺序列表,在绘制时将会连续画出QCPLayerable对象。

QCPLayer包含有序的QCPLayerable对象,QCPLayerable是所有可见对象的基类,如:axes、grids、graph和item等。

4.2 默认图层

背景层、网格层、主层、坐标轴层、图例层和矩形选择区域层。

默认情况下,QCustomPlot有六个图层,分别是:“background” “grid” “main” “axes” “legend”和“overlay”(注意顺序)。最先绘制的是“overlay”层,它只包含QCustomPlot选中的矩形(QCustomPlot::selectionRect),往后分别是“axes”和“legend”,表示默认轴和图示,在中间,有一个“main”层,它默认不含任何东西且为默认图层(QCustomPlot::setCurrentLayer)。这也就意味着所有可绘制的对象将会默认在此层,接着是QCPGrid对象(与QCPAxis紧密相连)。轴矩形区域应该绘制在所有图层后边,以便显示数据内容,因此QCPAxisRect实例被放在"background"层,当然你可以设置每个对象所在的图层(QCPLayerable::setLayer)。

4.3 控制图层渲染顺序

在绘制时控制图层非常简单:使用QCustomPlot::addLayer方法创建一个指定层的图层,如在“main”上层,然后用QCustomPlot::setCurrentLayer设置设置为你刚刚创建的图层,接下来的事情,只需要和往常一样创建图层上的对象即可,因为你设置了当前图层,所以对象都将会放置在该图层。如果你觉得比较麻烦,可以创建出了图层之后直接使用QCPLayer::setLayer将所有对象放在指定图层。你甚至可以移动整个图层的内容,方法是QCustomPlot::moveLayer。在同一图层内点的对象是覆盖形式的,删除一个图层不会删除对应的的对象QCustomPlot::removeLayer。

五、QCPLegend 图例

该对象管理了一个QCustomPlot的一个图例。它是一个小的Box区域,包含名称和图标。通过QCPAbstarctPlottable::adddToLegend来填充QCPLegend内容,对于主图示(QCustomPlot::legend)仅需设置QCustomPlot::setAutoAddPlottableToLegend为true(默认行为)就可以自动创建一些legend项,legend是一个与特定可绘制对象相关的对象,可以被QCPAbstractPlottable::removeFromLegend去除。

此外,QCPLegend提供了一些接口增加和直接管理这些legend:item、itemWithPlottable、itemCount、addItem、removeItem等。因为QCPLegend是从QCPLayoutGrid继承而来的,因此通过对象QCPLayoutElement可以将legend添加到任意位置,legend是QCPLayoutElement的元素,默认情况下每一个QCustomPlot只有一个legend(QCustomPlot::legend),表示主轴的内嵌布局中(QCPAxisRect::insetLayout),你可以通过QCPLayoutInset实现在矩形区域移动,使用QCPLayout/QCPLayoutElement接口实现矩形外移动。

六、子绘图实例

终于看完了QCPAxis、QCPAxisRect和QCPLayoutGrid,最后补充一些QCustomPlot本身的一些方法就可以进行子绘图了:

QCPGraph *addGraph(QCPAxis *keyAxis=nullptr,QCPAxis *valueAxis=nullptr);//默认是左下两个轴,你也可以指定特定的轴
QCPGraph *graph()const;
QCPGraph *graph(int index)const;
bool removeGraph(QCPGraph * graph);
bool removeGraph(int index);
bool clearGraph();
int graphCount()const ;
QCPLayoutGrid * QCustomPlot::plotLayout()const;//返回顶层QCustomPlot的布局,通常内容只是一个矩形区域
//Generate data
QVector<double> x,ys,yc,y_cs;
for(double xi=-2*M_PI;xi<2*M_PI;xi+=0.1)
{
    x.push_back(xi);
    ys.push_back(sin(xi));
    yc.push_back(cos(xi));
    y_cs.push_back(sin(xi)+cos(xi));
}

//Create Rectangle Area and add to QCustomplot
QCPAxisRect * R00=new QCPAxisRect(this->ui->qcust_curve);
QCPAxisRect * R10=new QCPAxisRect(this->ui->qcust_curve);
QCPAxisRect * R20=new QCPAxisRect(this->ui->qcust_curve);
this->ui->qcust_curve->plotLayout()->clear();
this->ui->qcust_curve->plotLayout()->addElement(0,0,R00);
this->ui->qcust_curve->plotLayout()->addElement(1,0,R10);
this->ui->qcust_curve->plotLayout()->addElement(2,0,R20);

//Draw graphs with data
this->ui->qcust_curve->addGraph(R00->axis(QCPAxis::atBottom),R00->axis(QCPAxis::atLeft));
this->ui->qcust_curve->addGraph(R10->axis(QCPAxis::atBottom),R10->axis(QCPAxis::atLeft));
this->ui->qcust_curve->addGraph(R20->axis(QCPAxis::atBottom),R20->axis(QCPAxis::atLeft));

this->ui->qcust_curve->graph(0)->setData(x,ys);
this->ui->qcust_curve->graph(0)->rescaleAxes();
this->ui->qcust_curve->graph(0)->setName("y=sin(x)");

this->ui->qcust_curve->graph(1)->setData(x,yc);
this->ui->qcust_curve->graph(1)->rescaleAxes();
this->ui->qcust_curve->graph(1)->setName("y=cos(x)");

this->ui->qcust_curve->graph(2)->setData(x,y_cs);
this->ui->qcust_curve->graph(2)->rescaleAxes();
this->ui->qcust_curve->graph(2)->setName("y=cos(x)+sin(x)");

//Add Legends
QCPLegend *arLegend00=new QCPLegend;
R00->insetLayout()->addElement(arLegend00,Qt::AlignTop|Qt::AlignRight);
arLegend00->setLayer("legend");
arLegend00->addItem(new QCPPlottableLegendItem(arLegend00, this->ui->qcust_curve->graph(0)));

QCPLegend *arLegend10=new QCPLegend;
R10->insetLayout()->addElement(arLegend10,Qt::AlignTop|Qt::AlignRight);
arLegend10->setLayer("legend");
arLegend10->addItem(new QCPPlottableLegendItem(arLegend10, this->ui->qcust_curve->graph(1)));

QCPLegend *arLegend20=new QCPLegend;
R20->insetLayout()->addElement(arLegend20,Qt::AlignTop|Qt::AlignRight);
arLegend20->setLayer("legend");
arLegend20->addItem(new QCPPlottableLegendItem(arLegend20, this->ui->qcust_curve->graph(2)));

结果如下:
1


[1] https://www.qcustomplot.com/index.php/support/forum/314

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QCustomplot(五)QCPAxisRect进行子绘图 的相关文章

  • 字符的全排列、字符的组合

    一 字符的全排列 题目描述 输入一个字符串 按字典序打印出该字符串中字符的所有排列 例如输入字符串abc 则打印出由字符a b c所能排列出来的所有字符串abc acb bac bca cab和cba 输入描述 输入一个字符串 长度不超过9
  • HTTP带用户名和密码请求

    import java io IOException import org apache commons codec binary Base64 import com cn mid system urls UrlUtils import o
  • n*m的格子中正方形个数和长方形个数

    问题描述 1 xff0e 设有一个nm方格的棋盘 xff08 1 m n 100 xff09 求出该棋盘中包含多少个正方形 多少个长方形 xff08 不包括正方形 xff09 例如 xff1a 当n 61 2 xff0c m 61 3时 正
  • Linux数字权限

    linux系统文件夹 从左至右 xff0c 第一位数字代表文件所有者的权限 xff1b 第二位数字代表同组用户的权限 xff1b 第三位数字代表其他用户的权限 而具体的权限是由数字来表示的 xff1a 读取的权限等于4 xff0c 用r表示
  • 八大排序算法C语言实现

    1 插入排序 1 1 直接插入排序 基本原理 xff1a 将第n个数插入已经排序好的 xff0c 长度为n 1的序列中 从n 1长度的序列中查找出待插入的元素应该插入的位置 xff1b 给插入元素腾出空间 操作方法 xff1a 从第2个数开
  • CLion下的gtest测试

    在mac环境中 xff0c 使用CLion编译的简单gtest程序 一 下载gtest源码 加入工程中 xff1a 二 编写CMakeList txt 文件 在文件中添加头文件和链接库文件 xff0c 并将链接库文件与目标文件进行链接 sp
  • python中json与dict的互相转换(编码与解码)及其简单实现

    在json模块中 将json转换为dict数据的方法有 xff1a load loads xff08 xff09 其中 xff0c load 方法从文件中提取数据进行转换 将dict转换为json数据的方法有 xff1a dump dump
  • gtest中ASSERT与EXPECT断言的区别

    参考资料查找到ASSERT断言与EXPECT断言的区别 xff1a ASSERT 系列的断言 xff0c 当检查点失败时 xff0c 退出当前函数 xff08 注意 xff1a 并非退出当前案例 xff09 EXPECT 系列的断言 xff
  • gtest参数化

    步骤 xff1a 1 创建一个类 xff0c 继承testing TestWithParam xff0c T是你需要参数化的参数类型 xff0c 比如参数类型为int 2 使用新宏TEST P替代TEST 在TEST P宏里 xff0c 可

随机推荐

  • gtest中字符串比较是否相等

    1 EXPECT EQ val1 xff0c val2 xff09 class StringCmpTest span class token punctuation span public testing span class token
  • 白盒测试——逻辑覆盖

    白盒测试中的逻辑覆盖有以下六种方法 xff1a 1 语句覆盖 xff1a 每个可执行语句至少被执行一次 2 判定覆盖 xff1a 每个判定的每个分支都至少执行一次 3 条件覆盖 xff1a 判定式中每个条件的每个分支至少执行一次 4 判定条
  • 计算机网络面试题整理

    面试很多时候被问到的问题 xff0c 感觉都没答好 xff0c 统一整理一下 更新 8 23 GET和POST的区别 xff1f GET和POST方法没有实质上区别 xff0c 只是报文格式不同 GET和POST是HTTP协议中的两种请求方
  • 【C语言】c/c++中常用的预定义宏:__LINE__, __func__, __FILE__, __DATE__, __TIME__

    ANSI C标准中的预定义宏 xff08 也是常用的 xff09 xff1a LINE xff1a 在代码中插入当前行号 func xff1a 在代码中插入当前行所在的函数的函数名 FILE xff1a 在代码中插入当前文件的文件名 DAT
  • 无人机入门知识

    无人机入门知识 无人机的定义 现在提到的 无人机 xff0c 通常是说 无人飞行载具 xff08 Unmanned Aerial Vehicle xff0c 简称UAV xff09 xff0c 或称无人飞机 无人飞机系统 xff08 Unm
  • http协议

    一 认识url url被称为统一资源定位符 xff0c 用来表示从互联网上得到的资源位置和访问这些资源的方法 他的表示方法一般为 xff1a span class token operator lt span 协议 span class t
  • 大小端区别和判断

    在代码中看到往寄存器写数据的时候 xff0c 使用到 volatile uint32 t address 61 cpu to le32 value xff0c 进一步追踪 xff0c if BYTE ORDER 61 61 LITTLE E
  • 结构体对齐详解

    1 结构体数据成员对齐的意义 许多实际的计算机系统对基本类型数据在内存中存放的位置有限制 xff0c 它们会要求这些数据的起始地址的值是某个数k的倍数 xff0c 这就是所谓的内存对齐 xff0c 而这个k则被称为该数据类型的对齐模数 al
  • C语言基础之格式化占位符

    在 printf 系列函数中 xff0c 下列哪个格式化占位符有可能导致内存任意写风险 A A n B d C p D s 使用printf修改变量的值 VS2008中使用 n输出遇到的问题及解决方法 include lt stdio h
  • 不常用的访问控制方式——http auth

    今天遇到一个http auth方式的访问控制 xff0c 访问页面时出现输入用户名与密码的验证 xff1a 使用ncrack爆破登陆后 xff0c 当想要爆破目录时 xff0c 必须每次请求都带着authorication头 xff0c 使
  • 数据库中字符串匹配函数like、rlike、instr、regexp_extract

    instr 简介 MySQL hive中函数 xff0c instr str substr position occurrence 其中str代表从哪个字符串中搜索 xff0c substr代表搜索哪个子字符串 xff0c 返回值为子字符串
  • 【C语言】实现linux下的基于C语言的一个简单的TCP客/服 端的通信

    对于基础的好的朋友可以直接取代码 xff0c 如果想要看详细解析的朋友可以详看下方的解析 TCP服务端代码 xff1a include lt stdio h gt include lt string h gt include lt stdl
  • 实验二 OpenGL的简单动画

    ZZU的学弟学妹们不要抄作业哦 一 实验目的 1 掌握OpenGL的闲置函数 2 掌握OpenGL的时间函数 3 掌握OpenGL的简单动画功能 4 了解OpengGL裁剪窗口 视区 显示窗口的概念和它们之间的关系 5 进一步掌握OpenG
  • 使用脚本(命令行)编译KEIL工程

    参考KEIL官网 http www keil com support man docs uv4 uv4 commandline htm Keil Build bat脚本 64 echo off set UV 61 D Keil v5 UV4
  • (二)五次多项式轨迹规划

    一 三次多项式轨迹规划的缺陷 上一篇文章说道 xff0c 三次多项式轨迹规划只能够保证速度和位移连续 xff0c 并不能保证加速度连续 加速度不连续将会对使电机抖动 甚至冲击 二 轨迹规划中的五次多项式 我们对加速度数值进行指定 xff0c
  • (三)抛物线过渡的线性函数规划

    前面说到 xff0c 无论是三次还是五次多项式进行规划存在以下缺点 xff1a 位移往返没有匀速段 这一节中 xff0c 我们的研究对象是初速度和末速度都为0关节运动 一 无过渡线性函数 假设时刻 t t t 和角度
  • GCC的学习(二)头文件及其库制作

    当前目录 43 相对路径 61 绝对路径大写i xff0c I头文件包含路径大写l xff0c L库文件路径小写l xff0c l库名字 xff08 去头去尾没有lib xff0c 也没有so ldd 查看动态库连接库存在性及其路径nm 查
  • VSCODE(八)launch 调试与运行

    前面讲了如何配置任务文件tasks json xff0c 调试功能在程序程序经常会用上 xff0c 那么VSCODE是完成调试功能的呢 xff1f 答 xff1a vscode文件夹内的launch json文件配置 xff0c 一些调试器
  • C++11线程库 (七) 线程的停止

    在这篇文章里 xff0c 我们将会讨论如何在C 43 43 11下停止和终止一个线程 为什么C 43 43 11不直接提供一个停止线程的方法 xff1f 这是因为线程在停止之前可能有一些资源需要被释放 关闭 xff0c 比如说 xff1a
  • QCustomplot(五)QCPAxisRect进行子绘图

    子绘图是比较复杂的 xff0c 你几乎需要掌握QCustomPlot所有类及其含义 那么需要掌握的类有 xff1a QCPAxis 描述轴行为 xff0c 轴需要依赖QCPAxisRectQCPAxisRect 描述矩形区域 xff0c 区