0、说明

本节翻译总结自:Qt Plotting Widget QCustomPlot - User Interactions

本节内容是使用QCustomPlot实现绘图和用户交互功能。

本文代码中的变量customPlot是QCustomPlot类型的指针,实际使用时,应当用ui->customPlot,表示UI界面中用于绘图的QCustomPlot。

QCustomPlot提供了多种内置的用户交互方法,这些方法可以分类归纳如下:

  • 范围调整:通过鼠标拖拽或者鼠标滚轮实现;
  • 选择要素:通过鼠标点击;
  • 点击实例时发送信号。

1、范围调整

默认情况下,用户调整坐标轴范围的方法是在分别在对应的QCPAxisRect上进行拖拽。

为了实现在QCustomPlot上实现范围拖拽,需要在当前允许的交互上增加Flag QCP::iRangeDrag。这一点可以通过customPlot -> setInteraction( QCP::iRangeDrag , true)做到。如果想要只允许在一个方向上拖拽,可以用QCPAxisRect::setRangeDrag并且制定参数为Qt::Vertical或Qt::Horizontal。如果想允许在所有方向上拖拽(当然这也是默认的),可以用 Qt::Vertical | Qt::Horizontal 作为参数。

在拖拽过程中,通过QCPAxisRect::setRangeDragAxes设置的轴将会实时更新其范围;这将会给用户通过抓取坐标平面来实现移动坐标系的感觉。默认的QCustomPlot的轴是QCustomPlot::xAxisQCustomPlot::yAxis

以上只是改变了范围的区间,如果我们想改变范围的大小,例如缩放图像,用户可能会用鼠标滚轮。该行为是通过Flag QCP::iRangeZoom控制的,当然它也需要用QCustomPlot::setInteraction来激活。和拖拽类似,对于缩放的轴和方向也是可以选择的,具体可以看函数QCPAxisRect::setRangeZoomAxes 和 QCPAxisRect::setRangeZoom。除此之外,缩放因子(滚动一次滚轮时缩放倍数)由QCPAxisRect::setRangeZoomFactor决定。

2、选择要素

2.1、某一类要素的选择

QCustomPlot提供了要素选择的机制,允许用户选择画布上的任意要素,例如坐标轴和图像。

某一类要素是否可以选中,是通过在setInteraction方法中设置Flag QCP::iSelect(...)来实现的。例如,通过设置customPlot -> setInteraction( QCP::iSelectPlottables , true )就允许用户通过点击的方法来选中Plottable(比如图像)。通过参考文档QCP::Interaction可以获取全部交互Flag。

如果想要同时选中多个要素,可以设置交互Flag QCP::iMultiSelect。这样用户就可以拖过按CTRL键,依次选中多个要素。(这个键位可以通过QCustomPlot::setMultiSelectModifier修改)。

被选中的要素会用加粗的蓝色线条绘制。

2.2、控制单个要素的选择

对某个具体对象的可选属性,可以用setSelectable方法进行调整。例如,如果我们不想某个图像被用户选择,可以用方法thatGraph->setSelectable(false)。

要素的选择状态可以用setSelected函数进行调整,这样的话,即使某个要素是无法选中的(通过上一段的方法),我们依然可以通过该方法来在程序中通过上述方法修改它的状态为选中的。

如果要取消对于画板上所有要素的选择,可以用QCustomPlot::deselectAll

2.3、被选择要素的外观

一个被选中的要素通常会用和它原来绘制方式不同的画笔、刷子、字体来显示。这一点可以通过方法QCPGraph::setSelectedPenQCPGraph::setSelectedBrushQCPAxis::setSelectedLabelFontQCPAxis::setSelectedBasePenQCPItemText::setSelectedColor

来进行修改。至于这些方法的含义,可以很容易从它们的名字中看出来。

这些方法,和一开始绘制要素时的方法名十分相似,就是加了前缀"Selected"。

2.4、要素的多个组成部分

一些要素(比如坐标轴、图例)可能有多个组成部分,这时如果我们只用一个boolean参数来表示选择状态就不太合适了。这种情况下,不管是可选择性还是选中状态,都应当是SelectablePart的Flag的一组 or组合,也就是说,不同的组分要分别通过它们各自的QFlag的组合(通过or连接)来说明。

每个多组分的要素都需要定义一个它自己的SelectablePart。

例如,QCPAxis通常是由三部分组成的——刻度线、刻度数字、轴标签(如下)。

因此这三部分都需要各自指明它们的可选择性,QCPAxis::SelectablePart定义了QCPAxis::spNoneQCPAxis::spAxisQCPAxis::spTickLabelsQCPAxis::spAxisLabel。如果想要刻度线和刻度数字可选,但是轴标签不可选,可以用theAxis->setSelectableParts(QCPAxis::spAxis|QCP::spTickLabels)。

如果想控制当前的多组分选择状态,可以用QCPAxis::setSelectedParts方法。

2.5、对要素选中状态的响应

每当选中要素改变时,每个要素都会发送一个信号selectionChanged。不管这个改变是由于用户自主选择引起的还是程序中通过调用方法setSelected/setSelectedParts引起的。

如果是由于用户交互引起的改变,会发送QCustomPlot::selectionChangedByUser信号。在该信号的槽函数中,我们可以检查特定要素的选中状态并对其做出反应。如果要检查某种特定类型的选中,可以用方法QCustomPlot::selectedPlottablesselectedItemsselectedAxesselectedLegends

3、用户交互信号

用户交互信号与选择机制是相互独立的,QCustomPlot会基于用户的操作发送多重信号。最低级的信号是QCustomPlot::mouseDoubleClick、mousePress、mouseMove、mouseRelease和mouseWheel信号,这些信号的发送时机,可以从它们的名字中看出来。

也有一些高级的信号,它们表示在具体对象上发生的事件——QCustomPlot::plottableClick、plottableDoubleClick、itemClick、itemDoubleClick、axisClick、axisDoubleClick、legendClick、legendDoubleClick、titleClick和titleDoubleClick。

所有这些信号都表示了具体哪个要素被点击了,正如和QMouseEvent相关的事件那样。

案例Package中包含了一个使用多方面用户交互系统的例子(这里不再说明),它也告诉了我们如何改进交互系统以更好满足我们需求的方法。

Qt:QCustomPlot使用教程(三)——用户交互的更多相关文章

  1. Qt:QCustomPlot使用教程(二)——基本绘图

    0.说明 本节翻译总结自:Qt Plotting Widget QCustomPlot - Basic Plotting 本节内容是使用QCustomPlot进行基本绘图. 本节教程都使用custom ...

  2. Expression Blend实例中文教程(6) - 项目控件和用户交互控件快速入门

    前文我们曾经描述过,微软把Silverlight控件大致分为三类: 第一类: Layout Controls(布局控件) 第二类: Item Controls (项目控件) 第三类: User Int ...

  3. PySide——Python图形化界面入门教程(三)

    PySide——Python图形化界面入门教程(三) ——使用内建新号和槽 ——Using Built-In Signals and Slots 上一个教程中,我们学习了如何创建和建立交互widget ...

  4. Android SDK上手指南 3:用户交互

    在这篇教程中,我们将对之前所添加的Button元素进行设置以实现对用户点击的检测与响应.为了达成这一目标,我们需要在应用程序的主Activity类中略微涉及Java编程内容.如果大家在Java开发方面 ...

  5. 手把手教从零开始在GitHub上使用Hexo搭建博客教程(三)-使用Travis自动部署Hexo(1)

    前言 前面两篇文章介绍了在github上使用hexo搭建博客的基本环境和hexo相关参数设置等. 基于目前,博客基本上是可以完美运行了. 但是,有一点是不太好,就是源码同步问题,如果在不同的电脑上写文 ...

  6. 无废话ExtJs 入门教程三[窗体:Window组件]

    无废话ExtJs 入门教程三[窗体:Window组件] extjs技术交流,欢迎加群(201926085) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3 ...

  7. 中文翻译:pjsip教程(三)之ICE stream transport的使用

    1:pjsip教程(一)之PJNATH简介 2:pjsip教程(二)之ICE穿越打洞:Interactive Connectivity Establishment简介 3:pjsip教程(三)之ICE ...

  8. Nginx教程(三) Nginx日志管理

    Nginx教程(三) Nginx日志管理 1 日志管理 1.1 Nginx日志描述 通过访问日志,你可以得到用户地域来源.跳转来源.使用终端.某个URL访问量等相关信息:通过错误日志,你可以得到系统某 ...

  9. python的学习笔记01_2变量 常量 注释 用户交互 格式化输出

    变量是什么? 变量的作用  Variables are used to store information to be referenced and manipulated in a computer ...

随机推荐

  1. 学习Java第10天

    今天所作的工作: 1.线程 2.网络通信 明天工作安排: 做点教材后的案例,复习所学内容 总结一下,10天的时间,看完了Java从入门到精通,只能说是看完了,这里加一个表情笑哭,应该算是知道Java的 ...

  2. Java 中使用正则表达式校检IP是否输入正确

    感谢大佬案例:https://www.jb51.net/article/114671.htm 正则表达式学习:(待办)近期总结

  3. CABasicAnimation动画

    使用CABasicAnimation动画: CALayer *znzLayer; = [[CALayer alloc]init]; //创建不断该表CALayer的transform属性动画 CABa ...

  4. Appium链接夜神模拟器

    参考官方技术文档: http://appium.io/slate/cn/master/ 确保已经安装jdk和adt adb需要配置系统环境变量: D:\adt-bundle-windows-x86_6 ...

  5. Lesson12——NumPy 字符串函数之 Part1:字符串操作函数

    NumPy 教程目录 1 NumPy 字符串函数 以下函数用于对 dtype 为 numpy.string_ 或 numpy.unicode_ 的数组执行向量化字符串操作. 它们基于 Python 内 ...

  6. 帆软报表(finereport)根据提供的数据求出该日期所在的季度

    根据当前日期求字段中日期的季度 Oracle数据库 select T1.INDEXCODE ,T1.CREATETIME ,CASE when T1.CREATETIME = (case when t ...

  7. opencv笔记-SimpleBlobDetector

    通用的 Blob 检测方法包括:Laplacian of Gaussian(LoG), Difference of Gaussian(DoG), Derterminant of Hessian(DoH ...

  8. Note -「单位根反演」学习笔记

    \(\mathcal{Preface}\)   单位根反演,顾名思义就是用单位根变换一类式子的形式.有关单位根的基本概念可见我的这篇博客. \(\mathcal{Formula}\)   单位根反演的 ...

  9. VSCode官方的配置同步方案

    前言 这几天在迁移电脑工作环境,对于VSCode,我实在不想从头做下载插件.配置代码规则这样的事情,于是求助百度,搜索结果靠前的解决方案基本都是使用Setings Sync插件,于是我就从了. 经过好 ...

  10. SpringMVC--@RequestMapping注解标注方法解析

    SpringMVC--@RequestMapping注解标注方法解析 本文是基于springboot进行源码追踪分析 问题 @RequestMapping注释的类及方法,Spring是何时,何种方式解 ...