qwt 之 QwtPlotPicker

QwtPlotMarkerQwtPlotPickerQwt 库中用于增强 QwtPlot 功能的两个重要类。它们分别用于在图中添加标记和实现交互式的选择或拖动功能。

QwtPlotPicker 提供了交互式的选择工具,它允许用户通过鼠标点击或拖动来选择图表中的数据点或区域。这对于实现缩放、平移或者其他基于用户输入的操作非常有用。

主要功能

• 选择模式:可以选择不同的选择模式,如点选择、矩形选择、多边形选择等。
• 事件处理:通过信号和槽机制响应用户的交互行为(如鼠标点击、拖动等)。
• 坐标转换:提供从屏幕坐标到数据坐标的转换方法。
• 自定义绘图:可以通过重写绘制函数来自定义选择框或其他视觉反馈。

示例代码 1

#include <QApplication>
#include <QwtPlot>
#include <QwtPlotCurve>
#include <QwtPlotPicker>
#include <QwtPickerMachine>
#include <QwtPlotPanner> // 如果需要平移功能class PickerTracker : public QObject {Q_OBJECTpublic slots:void trackerText(const QString &text) {qDebug() << "Tracker Text:" << text;}void selected(const QPointF &pos) {qDebug() << "Selected Position:" << pos;}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);// 创建并配置 QwtPlotQwtPlot plot;plot.setTitle("QwtPlotPicker Example");// 添加一条曲线QwtPlotCurve *curve = new QwtPlotCurve("Sample Curve");QVector<double> xData = {0.0, 1.0, 2.0, 3.0, 4.0};QVector<double> yData = {0.0, 1.0, 4.0, 9.0, 16.0};curve->setSamples(xData, yData);curve->attach(&plot);// 创建并配置 QwtPlotPickerQwtPlotPicker *picker = new QwtPlotPicker(QwtPlot::xBottom, QwtPlot::yLeft, QwtPicker::PointSelection,QwtPlotPicker:: RubberBand, QwtPicker::AlwaysOn, plot.canvas());picker->setStateMachine(new QwtPickerDragPointMachine()); // 设置选择模式// 连接信号和槽PickerTracker tracker;connect(picker, SIGNAL(trackerText(const QString &)), &tracker, SLOT(trackerText(const QString &)));connect(picker, SIGNAL(selected(const QPointF &)), &tracker, SLOT(selected(const QPointF &)));// 如果需要平移功能QwtPlotPanner *panner = new QwtPlotPanner(plot.canvas());panner->setMouseButton(Qt::MidButton); // 使用中间按钮进行平移// 显示窗口plot.resize(800, 600);plot.show();return app.exec();
}

示例代码 2

	class DistancePicker : public QwtPlotPicker{public:DistancePicker( QWidget* canvas ): QwtPlotPicker( canvas ){setTrackerMode( QwtPicker::ActiveOnly );setStateMachine( new QwtPickerDragLineMachine() );setRubberBand( QwtPlotPicker::PolygonRubberBand );}virtual QwtText trackerTextF( const QPointF& pos ) const QWT_OVERRIDE{QwtText text;const QPolygon points = selection();if ( !points.isEmpty() ){QString num;num.setNum( QLineF( pos, invTransform( points[0] ) ).length() );QColor bg( Qt::white );bg.setAlpha( 200 );text.setBackgroundBrush( QBrush( bg ) );text.setText( num );}return text;}};

setStateMachine 方法

QwtPlotPickersetStateMachine() 方法用于设置选择器的状态机,这决定了用户如何与图表进行交互。Qwt 提供了几种预定义的状态机类,每种状态机都实现了一种特定的交互模式。以下是 Qwt 中常见的几种状态机:

  1. QwtPickerMachine
    这是所有其他状态机的基础类,它本身不提供具体的行为,但可以作为自定义状态机的起点。
  2. QwtPickerClickPointMachine
    这种状态机允许用户通过单击鼠标来选择一个点。每次点击都会触发一个选定点的信号。
    • 适用场景:当你只需要用户在图表上点击以选择单个数据点时使用。
  3. QwtPickerDragPointMachine
    这种状态机允许用户通过拖动鼠标来选择一个点。用户按下鼠标按钮并移动到新的位置后释放按钮,这个新位置会被视为选定的点。
    • 适用场景:适用于需要更精确地选择或调整图表上的某个点的情况。
  4. QwtPickerRectMachine
    这种状态机允许用户通过拖动鼠标绘制一个矩形区域来选择多个点。矩形的选择框会随着鼠标的移动而更新,直到用户释放鼠标按钮。
    • 适用场景:当你需要让用户选择一个矩形区域内的所有数据点时使用。
  5. QwtPickerPolygonMachine
    这种状态机允许用户通过连续点击来创建一个多边形区域,最终形成一个封闭的多边形选择区域。用户可以通过双击或者按下一个特定的键(如 Enter)来完成多边形的选择。
    • 适用场景:适用于复杂形状的选择区域,比如非矩形的不规则区域。

setStateMachine 使用示例

#include <QApplication>
#include <QwtPlot>
#include <QwtPlotCurve>
#include <QwtPlotPicker>
#include <QwtPickerMachine>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 创建并配置 QwtPlotQwtPlot plot;plot.setTitle("QwtPlotPicker Example");// 添加一条曲线QwtPlotCurve *curve = new QwtPlotCurve("Sample Curve");QVector<double> xData = {0.0, 1.0, 2.0, 3.0, 4.0};QVector<double> yData = {0.0, 1.0, 4.0, 9.0, 16.0};curve->setSamples(xData, yData);curve->attach(&plot);// 创建并配置 QwtPlotPickerQwtPlotPicker *picker = new QwtPlotPicker(QwtPlot::xBottom, QwtPlot::yLeft, QwtPicker::PointSelection,QwtPlotPicker::RubberBand, QwtPicker::AlwaysOn, plot.canvas());// 设置状态机picker->setStateMachine(new QwtPickerClickPointMachine()); // 单点选择// 或者// picker->setStateMachine(new QwtPickerDragPointMachine()); // 拖动选择点// 或者// picker->setStateMachine(new QwtPickerRectMachine()); // 矩形区域选择// 或者// picker->setStateMachine(new QwtPickerPolygonMachine()); // 多边形区域选择// 显示窗口plot.resize(800, 600);plot.show();return app.exec();
}

自定义状态机

如果你的需求超出了上述预定义状态机的功能,你可以继承 QwtPickerMachine 类并实现自己的状态机逻辑。

综合应用

当你想要创建一个带有交互功能的图表时,通常步骤如下:

  1. 创建 QwtPlot 实例。
  2. 添加绘图项,如 QwtPlotCurve 或其他类型的绘图项。
  3. 创建并配置 QwtPlotMarker 来添加静态标记。
  4. 创建并配置 QwtPlotPicker 来实现交互功能,并根据需要设置选择模式和事件处理逻辑。
  5. 连接信号和槽,以便对用户的交互行为做出响应。
  6. 如果需要,还可以添加其他交互组件,如 QwtPlotPanner 用于平移功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/63679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C/C++圣诞树

系列文章 序号直达链接1C/C爱心代码2C/C跳动的爱心3C/C李峋同款跳动的爱心代码4C/C满屏飘字表白代码5C/C大雪纷飞代码6C/C烟花代码7C/C黑客帝国同款字母雨8C/C樱花树代码9C/C奥特曼代码10C/C精美圣诞树11C/C俄罗斯方块12C/C贪吃蛇13C/C孤单又灿烂的神-鬼怪14C/C闪烁的爱心15C…

lua dofile 传参数

cat 1.lua arg[1] 111 arg[2] 222 dofile(./2.lua) cat 2.lua print("First argument is: " .. arg[1]) print("Second argument is: " .. arg[2]) 执行 lua 1.lua&#xff0c;结果为&#xff1a; First argument is: 111 Second argument is: 222 l…

电商数据流通的未来:API接口的智能化与自动化趋势

在数字化时代&#xff0c;电子商务行业正在以前所未有的速度发展&#xff0c;而API&#xff08;应用程序编程接口&#xff09;接口作为电商领域的重要组成部分&#xff0c;其应用和发展趋势也日益受到关注。API接口作为电商系统与外部服务或平台交互的桥梁&#xff0c;对电商数…

投标心态:如何在“标海战术”中保持清醒的头脑?

在竞争激烈的市场环境下&#xff0c;“标海战术”——即大规模参与投标——已经成为许多企业争取市场份额的重要策略。然而&#xff0c;盲目追求投标数量可能导致资源浪费、团队疲劳以及战略目标的模糊化。在这种高强度的竞争模式中&#xff0c;如何保持清醒的头脑&#xff0c;…

【苍穹外卖】学习心得体会-随笔

前言 写了很久&#xff0c;终于可以完整运行项目了&#xff0c;记录下这几天的心得体会回顾一下知识点 第一天、Git 分布式版本控制工具 一、Git概述 定义&#xff1a;是分布式版本控制工具&#xff0c;用于管理软件开发中的源代码文件&#xff0c;像Java类、xml文件、html…

windows C#-使用构造函数

实例化类或结构时&#xff0c;将会调用其构造函数。 构造函数与该类或结构具有相同名称&#xff0c;并且通常初始化新对象的数据成员。 在下面的示例中&#xff0c;通过使用简单构造函数定义了一个名为 Taxi 的类。 然后使用 new 运算符对该类进行实例化。 在为新对象分配内存…

研发效能DevOps: Vite 使用 Element Plus

目录 一、实验 1.环境 2.初始化前端项目 3.安装 vue-route 4.安装 pinia 5.安装 axios 6.安装 Element Plus 7.gitee创建工程 8. 配置路由映射 9.Vite 使用 Element Plus 二、问题 1.README.md 文档推送到gitee未自动换行 2.访问login页面显示空白 3.表单输入账户…

5G 模组 RG500Q常用AT命令

5G 模组 RG500Q常用AT命令 5G 模组 RG500Q常用AT命令 at ATQNWPREFCFG\"mode_pref\",nr5g && sleep 1 at ATQNWPREFCFG\"nr5g_band\",79 && sleep 1 at atqnwlock\"commo…

NVIDIA DeepStream插件之Gst-nvtracker

NVIDIA DeepStream插件之Gst-nvtracker 1. 源由2. 基础知识3. Gst-nvtracker插件3.1 插件参数3.2 插件API接口 4. 分析问题5. 总结6. 参考资料 1. 源由 这篇的主要目的是稍微吐槽下NVIDIA的设计&#xff0c;当然其实他们做的还是不错的&#xff08;从系统架构设计角度看&#…

进程内存转储工具|内存镜像提取-取证工具

1.内存转储&#xff0c;内存转储&#xff08;Memory Dump&#xff09;是将计算机的物理内存&#xff08;RAM&#xff09;内容复制到一个文件中的过程&#xff0c;这个文件通常被称为“内存转储文件”或“核心转储文件”&#xff08;Core Dump&#xff09;,内存转储的主要目的是…

Lua语言入门 - Lua 面向对象

Lua 面向对象 面向对象编程&#xff08;Object Oriented Programming&#xff0c;OOP&#xff09;是一种非常流行的计算机编程架构&#xff0c;通过创建和操作对象来设计应用程序。 以下几种编程语言都支持面向对象编程&#xff1a; CJavaObjective-CSmalltalkC#Ruby Lua 是…

Pyqt6在lineEdit中输入文件名称并创建或删除JSON文件

1、创建JSON文件 代码 import osdef addModulekeyWordFile(self):if "" ! self.lineEdit_module.text():moduleFile self.lineEdit_module.text() .jsonelse:self.toolLogPrinting(请输入模块名称)returnfilePath modulekeyWordFileDir moduleFileif os.path.e…

【Leetcode 热题 100】236. 二叉树的最近公共祖先

问题背景 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 最近公共祖先的定义为&#xff1a;对于有根树 T T T 的两个节点 p p p、 q q q&#xff0c;最近公共祖先表示为一个节点 x x x&#xff0c;满足 x x x 是 p p p、 q q q 的祖先且 x x x 的深度尽可能大…

数据结构--堆的向上调整和向下调整

文章目录 1.完全二叉树2.堆向上调整3.堆向下调整4.测试代码 1.完全二叉树 下面的这个就是对于我们的完全二叉树的这个逻辑结构和物理结构的说明&#xff1a; 逻辑结构就是我们自己认为的进行购想出来的&#xff1b; 但是这个物理结构却是我们的这个数据结构在内存里面的真是…

智能挂号系统设计典范:SSM 结合 Vue 在医院的应用实现

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了医院预约挂号系统的开发全过程。通过分析医院预约挂号系统管理的不足&#xff0c;创建了一个计算机管理医院预约挂号系统的方案。文章介绍了医院预约挂号系统的系…

“魔法糖果盒的秘密:用朴素贝叶斯算法猜糖果颜色”

想象一下&#xff0c;你有一个神奇的糖果盒&#xff0c;这个糖果盒里有两种糖果&#xff1a;红色的和蓝色的。你闭上眼睛&#xff0c;从盒子里拿出一个糖果&#xff0c;然后尝一尝&#xff0c;你想知道这个糖果是红色的还是蓝色的。朴素贝叶斯算法就像是一个魔法规则&#xff0…

Transform组件的用法

文章目录 1. 概念介绍2. 使用方法3. 示例代码我们在上一章回中介绍了Checkbox Widget相关的内容,本章回中将介绍Transform Widget.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里说的Transform是一种容器类widget,它和Container组件类似。它可以包含其它的组件…

go面试问题

1 Go的内存逃逸如何分析 go build -gcflags-m main_pointer.go 2 http状态码 300 请求的资源可包括多个位置&#xff0c;相应可返回一个资源特征与地址的列表用于用户终端&#xff08;例如&#xff1a;浏览器&#xff09;选择 301 永久移动。请求的资源已被永久的移动到新U…

康冠科技嵌入式面试题及参考答案

LCD 驱动你自己做了哪些内容? 在 LCD 驱动开发中,首先是硬件层面的理解。需要仔细研究 LCD 的数据手册,明确其引脚定义,包括电源引脚、数据引脚、控制引脚等。比如,对于常见的 RGB 接口 LCD,要清楚哪几个引脚是用于传输红、绿、蓝三种颜色的数据,以及像 VSYNC(垂直同步…

TouchGFX移植(5)增加触屏驱动

一&#xff09;增加驱动代码gt9xxx.c和ctiic.c到工程中的BSP目录下: 二&#xff09;更改触摸文件STM32TouchController.cpp 1&#xff09;在STM32TouchController.cpp文件中增加&#xff1a; #include “gt9xxx.h” 2&#xff09;增加gt9xxx_init(); void STM32TouchControlle…