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. shell脚本检查域名证书是否过期

    最近公司的域名准备过期了,防止用户访问的时候出现异常,所以最近我们准备替换相关网站证书为最新的. (一般HTTPS证书有效期为1年,证书过期后或者该证书不是该域名的有效证书时,在浏览器中访问会出现如下 ...

  2. 谷歌CEO桑达尔·皮查伊:区块链可能撼动云计算

    谷歌CEO桑达尔·皮查伊在周二的季度收益电话会议上承认了Web3和区块链的力量. 皮查伊表示,Web3描述了基于区块链的互联网新愿景,区块链是一种分散.安全.透明的技术,支持加密货币网络.不可替代代币 ...

  3. Lesson1——NumPy NumPy 安装

    NumPy 教程目录 NumPy 安装 Python 官网上的发行版是不包含 NumPy 模块的.(pip list 测试一下) 我们可以使用以下几种方法来安装. 1 使用已有的发行版本 对于许多用户 ...

  4. BIMFACE 二次开发 SDK 之歌

    <BIMFACE SDK 之歌>讲述了作者与 BIMFACE 从相识.相知.相爱.相守的艳遇之爱唯美故事   我是一个小小的程序员 穿行在人来人往的IT行业之间 编程工作与建筑信息化相关 ...

  5. Net6 DI源码分析Part2 Engine,ServiceProvider

    ServiceProvider ServiceProvider是对IServiceProvider实现,它有一个internal的访问修饰符描述的构造,并需要两个参数IServiceCollectio ...

  6. SpringBoot使用IDEA设置的外部Tomcat启动

    前言 使用springboot内嵌的tomcat启动是没问题,但是工程是要放到服务器上的tomcat的,所以springboot内嵌的能够启动,但不代表服务器的tomcat能启动起来,我就遇到了这个问 ...

  7. xargs、sort、uniq命令

    xargs.sort.uniq命令,我们由LeetCode的一道题来引入,并使用加以理解: 题目是这样的:写一个 bash 脚本以统计一个文本文件 words.txt 中每个单词出现的频率. word ...

  8. spring filter详解

    一.Filter基本工作原理 1.Filter 程序是一个实现了特殊接口的 Java 类,与 Servlet 类似,也是由 Servlet 容器进行调用和执行的. 2.当在 web.xml 注册了一个 ...

  9. ANT中的copy和move标签

    Copy标签 该标签用于文件或文件集的拷贝,其属性如下: file 表示源文件. tofile 表示目标文件. todir 表示目标目录. overwrite 表示指定是否覆盖目标文件,默认值是不覆盖 ...

  10. charles模拟弱网

      Charles操作:延迟设置 >选择相应的网络延迟设置或者自定义延迟 >开启延迟即可,如图: