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。