Qt扩展-QCustomPlot 用户交互

QCustomPlot 用户交互

  • 一、概述
  • 二、操作范围
  • 三、选择机制
    • 1. 控制Graph的可选择性和选择状态
    • 2. 所选对象的外观
    • 3. 多部分对象
    • 4. 对选择变化做出反应
  • 四、用户交互信号

一、概述

QCustomPlot提供了多个内置的用户交互。它们大致可以分为

  • 通过用鼠标拖动和滚动鼠标滚轮进行范围操作
  • 通过点击选择绘图实体
  • 用户点击绘图实体时发出的信号

二、操作范围

这个其实就是开启鼠标上下左右平移或者缩放Graph的功能

用户操作轴范围的默认方法是在相应的QCPAxisRect上执行拖动操作。
在这里插入图片描述

要在QCustomPlot控件中启用范围拖动,需要将标志 QCP::iRangeDrag 添加到当前允许的交互中。这可以通过 customPlot->setInteraction(QCP::iRangeDrag, true) 来完成。要只允许在一个方向上拖动,请使用 QCPAxisRect::setRangeDrag 并指定Qt::Vertical或Qt::Horizontal。默认列表允许两个方向Qt::Vertical | Qt::Horizontal。

在拖动操作期间,通过QCPAxisRect::setRangeDragAxes配置的轴会实时更新其范围,自动导致重绘。这给用户的印象是通过用鼠标抓取来移动绘图坐标平面。最初,将范围拖动轴配置为矩形的底部和左侧轴。对于QCustomPlot控件的默认轴矩形,它们是QCustomPlot::xAxis和QCustomPlot::yAxis。

要改变范围的大小,即放大或缩小绘图,用户可以使用鼠标滚轮。此行为由交互标志QCP::iRangeZoom 控制,该标志也需要通过 QCustomPlot::setInteraction 激活。就像范围拖动一样,缩放也可以根据受影响的轴和方向进行选择,参见函数QCPAxisRect::setRangeZoomAxes和QCPAxisRect::setRangeZoom

。此外,缩放强度可以通过QCPAxisRect::setRangeZoomFactor来控制。在普通鼠标硬件上,一个鼠标滚轮步对应于应用于轴范围的这个因子。如果因子大于1,则向前滚动鼠标滚轮会减小范围(放大),向后滚动则会增大范围(缩小)。若要扭转此行为,请将鼠标滚轮缩放因子设置为小于1(但大于零)。缩放总是以绘图中当前鼠标光标的位置为中心。

这意味着将光标指向感兴趣的功能并滚动鼠标滚轮可以放大该功能。

三、选择机制

在这里插入图片描述

QCustomPlot提供了一种选择机制,允许用户选择图中的每个组件,如轴和图形。可以使用以 QCP::iSelect(…) 开头的交互标志来控制某类实体在图中是否通常可选择。例如,设置customPlot->setInteraction(QCP::iSelectPlottables, true)将允许用户通过点击它们来选择绘图(例如图形)。请查看所有交互标志的QCP::Interaction文档。

要允许同时选择多个对象,可以设置 QCP::iMultiSelect交互 标志。然后,用户可以通过按住多选择修饰符(参见QCustomPlot::setMultiSelectModifier)连续选择多个对象,默认情况下是Ctrl。

1. 控制Graph的可选择性和选择状态

可以使用单个对象上的setSelectable函数进一步微调可选择性。例如,如果绘图中的特定图形不能被用户选择,调用thatGraph->setSelectable(false)。可以通过setSelected函数以编程方式修改所选状态。即使禁用了用户的可选择性,也可以通过编程方式更改选择状态。

要取消选中图中的所有对象,请调用QCustomPlot::deselectAll。

2. 所选对象的外观

被选中的对象通常用不同的笔、笔刷或字体显示。其实就是让选择的对象更加突出的显示出来。这可以通过QCPGraph::setSelectedPen, QCPGraph::setSelectedBrush, QCPAxis::setSelectedLabelFont, QCPAxis::setSelectedBasePen, QCPItemText::setSelectedColor等方法进行配置,仅举几例。可以看到,它们的命名与原始(非选中)属性相似,但带有“Selected”前缀。

3. 多部分对象

一些对象(如轴线和图例)具有更复杂的外观,因此用于选择的单个布尔值是不够的。在这些情况下,可选择性和选择状态都是SelectablePart标志的一个或组合(各自的QFlags类型称为SelectableParts)。每个多部件对象定义自己的SelectablePart类型。
在这里插入图片描述

例如,QCPAxis在概念上由三部分组成:带有打勾标记的轴骨干打勾标签(数字)轴标签。由于这三个部分应该是可单独选择的,所以qcpaaxis::SelectablePart定义了qcpaaxis::spNone、qcpaaxis::spAxis、qcpaaxis::spTickLabels和qcpaaxis::spAxisLabel。要使轴骨干和刻度标签可选,但不能使轴标签可选,请调用theAxis->setSelectableParts(qcpaaxis::spAxis|QCP::spTickLabels)。

要控制多部件对象的当前选择状态,请使用qcpaaxis::setSelectedParts方法。

4. 对选择变化做出反应

当选择发生变化时,每个对象都会发出一个名为selectionChanged的信号。无论更改是由用户引起的,还是由调用setSelected/setSelectedParts以编程方式引起的,都无关紧要。

如果绘图中的选择被用户交互改变,则会发出QCustomPlot范围的信号QCustomPlot::selectionChangedByUser。

在连接到该信号的槽函数中,我们可以检查某些对象的选择状态并做出相应的反应。在这里,QCustomPlot::selectedPlottables、selectedItems、selectedax和selectedLegends方法对于检索特定类型的选定对象可能很有用。

四、用户交互信号

QCustomPlot独立于选择机制,在用户交互时发出各种信号。最低级的是QCustomPlot::mouseDoubleClick、mousePress、mouseMove、mouserrelease和mouseWheel信号。当QCustomPlot控件的相应事件触发时,会发出它们。注意,最干净的方法是创建QCustomPlot的子类,并用相同的名称重新实现事件方法(从QWidget 继承)。但是,如果我们不想子类化QCustomPlot,这些信号允许更容易地访问简单任务的用户交互。

还有更高级的信号,用于报告图中某些对象的单击和双击:QCustomPlot::plottableClick、plottableDoubleClick、itemClick、itemDoubleClick、axisClick、axisDoubleClick、legendClick、legendDoubleClick、titleClick和titleDoubleClick。所有这些信号都会报告哪个对象被单击了(如果是多部分对象,还会报告哪个部分),以及相关的QMouseEvent。

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

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

相关文章

typescript映射类型

ts映射类型简介 TypeScript中的映射类型(Mapped Type)是一种高级类型,它允许我们基于现有类型创建新的类型,同时对新类型的每个属性应用一个转换函数。通过使用映射类型,我们可以方便地对对象的属性进行批量操作&…

华为数通方向HCIP-DataCom H12-831题库(单选题:181-200)

第181题 以下关于OSPF的5类LSA中的转发地址(ForwardingAddress,FA) 的描述,正确的是哪一项? A、当FA地址为0.0.0.0时,收到该LSA的路由器认为到达目的网段的数据包应该发往对应的ABR,因此将到达ABR的下一跳地址作为这条外部路由的下一跳 B、当FA地址为0.0.0.0时,收到该LS…

C++算法 —— 动态规划(12)两道小题

文章目录 1、动规思路简介2、组合总和Ⅳ3、卡特兰数 背包问题需要读者先明白动态规划是什么,理解动规的思路,并不能给刚接触动规的人学习。所以最好是看了之前的动规博客,以及背包博客,或者你本人就已经懂得动规了。 1、动规思路简…

(二)激光线扫描-相机标定

1. 何为相机标定? 当相机拍摄照片时,我们看到的图像通常与我们实际看到的不完全相同。这是由相机镜头引起的,而且发生的频率比我们想象的要高。 这种图像的改变就是我们所说的畸变。一般来说,畸变是指直线在图像中出现弯曲或弯曲。 这种畸变我们可以通过相机标定来进行解…

华为云云耀云服务器L实例评测|Huawei Cloud EulerOS 自动化环境部署

[toc] Huawei Cloud EulerOS 自动化环境部署 云耀云服务器L实例【Huawei Cloud EulerOS 2.0 64bit】 Python Git Google Chrome Chromedriver Selenium More… 1. Python 镜像创建后自带。 2.Git 拉取项目。 sudo yum install git3. Google Chrome 使用root权限或sudo权…

【算法|动态规划No.11】leetcode53. 最大子数组和

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…

【image captioning】CaMEL: Mean Teacher Learning for Image Captioning(实现流程)

CaMEL: Mean Teacher Learning for Image Captioning(实现流程) 作者:安静到无声 个人主页 目录 CaMEL: Mean Teacher Learning for Image Captioning(实现流程)环境设置数据准备Evaluation训练程序推荐专栏参考代码: CaMEL: Mean Teacher Learning for Image Captioning.…

C++_pen_静态与常量

成员 常成员、常对象(C推荐使用 const 而不用#define,mutable) const 数据成员只在某个对象生存周期内是常量,而对于整个类而言却是可变的(static除外) 1.常数据成员(构造函数初始化表赋值) c…

常见的几种排序方式

常见的几种排序方式 1. 排序的概念2. 常见排序算法的实现2.1 插入排序2.1.1基本思想2.1.2 直接插入排序2.1.3 希尔排序( 缩小增量排序 ) 2.2 选择排序2.2.1基本思想2.2.2 直接选择排序:2.2.3 堆排序 2.3 交换排序2.3.1冒泡排序2.3.2 快速排序 2.4 归并排序2.4.1 基本思想2.4.2 …

【C语言进阶(11)】动态内存管理

文章目录 Ⅰ 存在动态内存分配的原因Ⅱ 动态内存函数1. malloc2. calloc3. realloc4. free (重要) Ⅲ 常见动态内存错误1. 对 NULL 指针的解引用操作2. 对动态开辟空间的越界访问3. 对非动态开辟内存使用 free 释放4. 使用 free 释放一块动态开辟内存的一部分5. 对同一块动态内…

Rust冒泡排序

Rust冒泡排序 这段代码定义了一个名为 bubble_sort 的函数,接受一个可变的整数类型数组作为输入,然后使用嵌套的循环来实现冒泡排序。外部循环从数组的第一个元素开始迭代到倒数第二个元素,内部循环从数组的第一个元素开始迭代到倒数第二个元…

【10】c++设计模式——>依赖倒转原则

关于依赖倒转原则,对应的是两条非常抽象的描述: 1.高层模块不应该依赖低层模块,两个都应该依赖抽象。 2.抽象不应该依赖细节,细节应该依赖抽象。 先用人话解释一下这两句话中的一些抽象概念: 1.高层模块:可…

字典与数组第七讲:工作表数据计算时为什么要采用数组公式(一)

《VBA数组与字典方案》教程(10144533)是我推出的第三套教程,目前已经是第二版修订了。这套教程定位于中级,字典是VBA的精华,我要求学员必学。7.1.3.9教程和手册掌握后,可以解决大多数工作中遇到的实际问题。…

使用关键字interface来声明使用接口-PHP8知识详解

继承特性简化了对象、类的创建,增加了代码的可重用性。但是php8只支持单继承,如果想实现多继承,就需要使用接口。PHP8可以实现多个接口。 接口类通过关键字interface来声明,接口中不能声明变量,只能使用关键字const声明…

【Golang】并发

并发 有人把Go语言比作 21 世纪的C语言 第一是因为Go语言设计简单 第二则是因为 21 世纪最重要的就是并发程序设计,而 Go 从语言层面就支持并发。同时实现了自动垃圾回收机制 先来了解一些概念: 进程/线程 进程是程序在操作系统中的一次执行过程&#…

创建GCP service账号并管理权限

列出当前GCP项目的所有service account 我们可以用gcloud 命令 gcloud iam service-accounts list gcloud iam service-accounts list DISPLAY NAME EMAIL DISABLED terraform …

java Spring Boot 将日志写入文件中记录

我们之前的一套操作来讲 日志都是在控制台上的 但 如果你的项目在正式环境上跑 运维人员突然告诉你说日志报错了,但你日志只在控制台上,那公司项目如果访问量很大 那你是很难在控制台上找到某一条日志的 这时 我们就可以用文件把它记下来 我们打开项目 …

OpenGL之光照贴图

我们需要拓展之前的系统,引入漫反射和镜面光贴图(Map)。这允许我们对物体的漫反射分量和镜面光分量有着更精确的控制。 漫反射贴图 我们希望通过某种方式对物体的每个片段单独设置漫反射颜色。我们仅仅是对同样的原理使用了不同的名字:其实都是使用一张覆盖物体的图像,让我…

扩散模型diffusion model 代码解读

代码来自这里 使用pytorch轻松实现简单扩散模型diffusion model(附可跑通全部代码) - 知乎 1.作者首先自己定义了一个数据集,也就是一堆散点,组成的S。 2.这些都是预先设置好的参数,也就是利用这些来做learning的提示…

Django的模版使用(Django-03)

一 模版的使用 模板引擎是一种可以让开发者把服务端数据填充到html网页中完成渲染效果的技术。它实现了 把前端代码和服务端代码分离 的作用,让项目中的业务逻辑代码和数据表现代码分离,让前端开发者和服务端开发者可以更好的完成协同开发。 静态网页&…