数据拾取¶
数据拾取是绘图控件的常见需求:鼠标移动时显示当前位置的数值。
Qwt7 增加了 QwtPlotSeriesDataPicker 类,鼠标在绘图区域移动时实时显示数据点信息。它支持两种拾取模式:Y 值拾取和最近点拾取,并可用于宿主绘图和寄生绘图。
- 双模式拾取:Y 值拾取或最近点拾取
- 线性插值:在数据点之间取得更精确的值
- 最近点拾取:用二分查找和窗口搜索处理大数据集
- 多曲线:同时处理多条曲线的数据拾取
- 自定义显示:文本样式、特征点绘制和背景
- 寄生绘图与宿主绘图:两者都能获取数据
头文件引入
1 | |
效果:

基本用法¶
QwtPlotSeriesDataPicker 继承 QwtPlotPicker,创建拾取器时传入绘图的 canvas 区域即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
拾取模式设置¶
QwtPlotSeriesDataPicker提供了两种拾取模式,可以通过setPickMode函数进行拾取模式的设置,拾取模式枚举如下:
1 2 3 4 5 | |
Y值拾取模式¶
Y值拾取模式(QwtPlotSeriesDataPicker::PickYValue)可以显示当前X位置对应所有曲线的Y值
1 2 | |
Y值拾取模式效果如下:

y值拾取模式下,可以通过setInterpolationMode方法设置是否进行插值计算,插值计算可以提高数据的精度,如果点比较稀疏,会通过线性插值方式计算出当前x轴对应的y值。
说明
插值默认开启。
1 2 | |
临近点拾取模式¶
临近点拾取模式(QwtPlotSeriesDataPicker::PickNearestPoint)会计算距离鼠标最接近的点进行拾取并显示,这个模式尤其适合用于类似频谱等绘图的峰值数据拾取
1 2 | |
临近点拾取模式效果如下:

临近点要计算曲线的点到鼠标位置的距离,如果全曲线遍历会非常耗时,为此,Qwt7提供了窗口搜索算法,能够快速找到距离鼠标最近的数据点
通过setNearestSearchWindowSize方法设置搜索窗口大小
1 2 3 | |
搜索窗口可以设置为以下几种方式:
- 0: 不使用窗口,搜索整个曲线
- 正数: 固定的窗口大小(数据点数量)
- 负数: 自适应窗口,使用曲线数据点总数的百分比(取绝对值,如-5表示5%)
搜索窗口大小默认为-5,也就是曲线点数的5%
警告 — 搜索窗口阈值
Qwt7 默认启用窗口搜索算法的阈值是 1000 个数据点:曲线点数超过 1000 时,窗口设置才会生效。
说明 — 数据排序
窗口优化算法要求曲线数据必须按 X 坐标升序排列。如果使用自定义数据源,请确保数据已正确排序。
其它属性设置¶
文本显示设置¶
QwtPlotSeriesDataPicker 可以设置文本显示位置,文本显示位置通过枚举 QwtPlotSeriesDataPicker::TextPlacement 定义。使用 setTextArea 函数设置文本放置的位置,默认为自动放置,根据拾取模式选择。
可以通过以下方法设置文本对齐样式和背景颜色:
1 2 3 4 | |
已知问题 — 寄生绘图的绘制顺序
QwtPlotSeriesDataPicker的绘制区域是宿主绘图的图层,寄生绘图属于宿主绘图的子窗口,因此寄生绘图绘制的图元会覆盖宿主绘图,寄生绘图显示的曲线位于QwtPlotSeriesDataPicker的绘制区域之上。目前的寄生绘图架构无法让QwtPlotSeriesDataPicker的内容显示在寄生绘图之上
特征点绘制¶
QwtPlotSeriesDataPicker拾取到的点称之为特征点,特征点会在曲线上标记出来,你可以通过以下方法设置特征点绘制样式
1 2 3 4 5 | |
自定义¶
自定义显示文本¶
显示的文本内容可以通过继承QwtPlotSeriesDataPicker并重写 valueString 方法来自定义数据点的显示格式:
下面是一个示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
valueString方法的order参数代表了显示的第n个特征点,如果你有多条曲线,这个参数会递增,你可以根据这个参数是否为0来换行
点击信号 (Click Signals)¶
QwtPlotSeriesDataPicker 为鼠标点击提供了点击信号。
信号说明¶
QwtPlotSeriesDataPicker 发出 clicked() 与 doubleClicked() 两个信号,参数均为发出信号的 picker 指针与点击的屏幕位置,签名如下:
1 2 3 4 5 | |
信号参数 (Signal Parameters):
| 参数 (Parameter) | 类型 (Type) | 说明 (Description) |
|---|---|---|
| picker | QwtPlotSeriesDataPicker* | 被点击的 picker 指针 (Pointer to the clicked picker) |
| pos | QPoint | 点击事件的屏幕位置 (Screen position of the click event) |
左键限制 (Left Button Only)¶
说明 — 仅左键
点击信号仅响应鼠标左键 (Qt::LeftButton)。右键和中键点击不会触发这些信号。
双击触发行为 (Double-Fire Behavior)¶
警告 — 双击触发顺序
当用户双击时,会先触发
clicked()信号,然后触发doubleClicked()信号。 这是 Qt 的标准行为,不是 Bug。如果你需要区分单击和双击,建议只连接其中一个信号,不要同时连接两个信号。
数据获取 (Getting Picked Data)¶
通过 featurePoints() 方法可以获取当前拾取到的数据点信息。
FeaturePoint 结构¶
每个被拾取的点由内嵌结构体 QwtPlotSeriesDataPicker::FeaturePoint 描述,它包含所属绘图项(item)、拾取到的坐标(feature)以及该点在系列数据中的索引(index)。其定义如下:
1 2 3 4 5 6 | |
字段说明 (Field Description):
| 字段 (Field) | 类型 (Type) | 说明 (Description) |
|---|---|---|
| item | QwtPlotItem* | 曲线指针,可通过 item->title().text() 获取曲线名称 |
| feature | QPointF | 数据点的坐标值 (x, y) |
| index | size_t | 数据点在曲线样本中的索引位置 |
featurePoints() 方法¶
featurePoints() 是一个 const 访问器,返回 QList<FeaturePoint>,签名如下:
1 2 | |
featurePoints() 返回当前 tracker 位置拾取到的所有特征点列表。通常在 clicked 或 doubleClicked 信号处理器中调用此方法获取点击位置的数据。
提示 — 多个特征点
返回的列表可能包含多个
FeaturePoint,因为鼠标位置可能同时对应多条曲线的数据点(特别是在 Y 值拾取模式下)。
组内信号转发 (Group Signal Forwarding)¶
QwtPlotSeriesDataPickerGroup 提供了组内点击信号的转发功能。
组信号说明¶
QwtPlotSeriesDataPickerGroup 会转发组内每个 picker 的 clicked() 与 doubleClicked() 信号,因此只需连接 group 一次即可覆盖所有成员;参数中的 picker 仍然指示被点击的具体成员。转发信号的签名如下:
1 2 3 4 5 | |
同步机制 (Sync-Before-Signal)¶
说明 — 信号发出前同步
Group 在发出点击信号之前,会先同步组内所有其他 picker 的位置。 这意味着当
clicked信号触发时,组内所有 picker 的featurePoints()都已经更新到同步后的位置。
多子图联动场景下这一点很重要:用户点击某个子图时,其他子图的 picker 已经同步到相同的 X 轴比例位置,可以直接读取所有子图在该位置的数据。
代码示例 (Code Example)¶
下面的示例连接 Group 的点击信号并获取拾取数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
多子图联动示例¶
借助 Group 的同步机制,多子图布局可以实现跨图数据检视:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | |