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. iptables匹配条件总结1

    源地址 -s选项除了指定单个IP,还可以一次指定多个,用"逗号"隔开即可 [root@web-1 ~]# iptables -I INPUT -s 172.16.0.116,172 ...

  2. Homework_3 (完整版)

    划水‍♂️!好耶! 果然还是逃不过作业,初三刚过就要营业 审题 爬虫+算法:划水中的员工 员工 A 此刻内心一酸,大年初一加班惨绝人寰,情不自禁打开 B 站,跟着网友一起划水看番. 但是由于技术故障原 ...

  3. 6. java IO 流

    一.流的分类: * 1.操作数据单位:字节流.字符流 * 2.数据的流向:输入流.输出流 * 3.流的角色:节点流.处理流 *二.流的体系结构 * 抽象基类               节点流(或文件 ...

  4. 随机UA

    from fake_useragent import UserAgent ua = UserAgent().random headers={ 'User-Agent':ua } print(heade ...

  5. BIMFACE 二次开发 SDK 之歌

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

  6. Jackson中处理map中的null key 或者null value 及实体字段中的null value

    1.map中有null key时的序列化  当有null key时,jackson序列化会报 Null key for a Map not allowed in JSON (use a convert ...

  7. OSChina 文

    转载请注明来源:https://www.cnblogs.com/hookjc/ http://www.oschina.net/p/carbon-forum   [高性能PHP论坛 Carbon For ...

  8. Linux发行版·常见Linux系统下载

    本专题页汇总最受欢迎的Linux发行版基本介绍和下载地址,如果您是一位刚接触Linux的新手,这里的介绍可能对您有所帮助,如果您是以为Linux使用前辈,也可以在评论处留下您宝贵意见和经验,以便让更多 ...

  9. ACM-ICPC 2015辽宁省赛

    省赛之于ACM 就是让省内的队伍互相比较而已~~~(何况弱省(本渣校  四个二等四个三等(其实是六个三道题 两个两道题,是院长后来和主办方沟通了下- - (本弱很水,但还是要吐槽:好水的省赛啊!!

  10. Firewalld防火墙——基础认知

    Firewalld防火墙 1.Firewalld概述 2.firewalld与iptables 的区别 3.firewalld区域的概念 4.firewalld数据处理流程 5.firewalld检查 ...