qwt 之 QwtPlotPicker

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

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

主要功能

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

示例代码 1

#include <QApplication>
#include <QwtPlot>
#include <QwtPlotCurve>
#include <QwtPlotPicker>
#include <QwtPickerMachine>
#include <QwtPlotPanner> // 如果需要平移功能

class PickerTracker : public QObject {
    Q_OBJECT

public 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);

    // 创建并配置 QwtPlot
    QwtPlot 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);

    // 创建并配置 QwtPlotPicker
    QwtPlotPicker *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);

    // 创建并配置 QwtPlot
    QwtPlot 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);

    // 创建并配置 QwtPlotPicker
    QwtPlotPicker *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 用于平移功能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门任务间的通讯-信号量【入门三】

继续上一篇任务创建 【Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门任务创建【入门二】-CSDN博客】 今天要实现再创建一个任务。【二值和互斥都进行测试】 ①、通过任务A发送一个信号量&#xff0c;另一个任务得到信号量后再发送helloworld。 ②、两个任务通过互斥信…

windows安装Elasticsearch及增删改查操作

1.首先去官网下载Elasticsearch 下载地址 我这里选择的是7.17.18 选择windows版本 下载完成后解压是这样的 下载完成后点击elasticsearch.bat启动elasticsearch服务 输入http://localhost:9200看到如下信息说明启动成功。 还有记得修改elasticsearch.yml文件&#xff0c;…

虚拟机VMware的安装问题ip错误,虚拟网卡

要么没有虚拟网卡、有网卡远程连不上等 一般出现在win11 家庭版 1、是否IP错误 ip addr 2、 重置虚拟网卡 3、查看是否有虚拟网卡 4、如果以上检查都解决不了问题 如果你之前有vmware 后来卸载了&#xff0c;又重新安装&#xff0c;一般都会有问题 卸载重装vmware: 第一…

户籍管理系统的设计与实现【源码+文档+部署讲解】

目 录 摘 要 Abstract 1 系统大概 1.1 系统背景 1.2 研究意义 1.3 本文结构 1.4 开发平台简介 1.4.1 Java语言的特点 1.4.2 J2EE概述 1.4.3 B/S结构概述 1.4.4 MySQL 1.4.5 Tomcat 1.4.6 JSP.NET 1.4.7 开发流程 1.4.8 Eclipse简介 1.4.9 of…

【Rust自学】5.1. 定义并实例化struct

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 5.1.1. 什么是struct struct的中文意思为结构体&#xff0c;它是一种自定义的数据类型&#xff0c;它允许程序为相关联的值命名和打包&am…

【自动驾驶】单目摄像头实现自动驾驶3D目标检测

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;传知代码 欢迎大家点赞收藏评论&#x1f60a; 目录 概述算法介绍演示效果图像推理视频推理 核心代码算法处理过程使用方式环境搭建下载权重文件pytorch 推理&#xff08;自动选择CPU或GPU&#x…

Python+OpenCV系列:AI看图识人、识车、识万物

在人工智能风靡全球的今天&#xff0c;用 Python 和 OpenCV 结合机器学习实现物体识别&#xff0c;不仅是酷炫技能&#xff0c;更是掌握未来的敲门砖。本篇博文手把手教你如何通过摄像头或图片输入&#xff0c;识别人、动物、车辆及其他物品&#xff0c;让你的程序瞬间具备 AI …

永磁同步电机负载估计算法--自适应扩张状态观测器

一、 原理介绍 在线性扩张观测器中&#xff0c;LESO观测器增益ω0 决定了观测器的跟踪速度&#xff0c;ω0 越大&#xff0c;观测器估计精度越高&#xff0c; 抗干扰能力越强&#xff0c;瞬态响应速度加快&#xff0c;过大则会引入高频噪声使系统不稳定。为使观测器在全速域内…

【Spring事务】深入浅出Spring事务从原理到源码

什么是事务 保证业务操作完整性的一种数据库机制 &#xff08;driver 驱动&#xff09;事务特定 ACID A 原子性 &#xff08;多次操作 要不一起成功 要不一起失败 &#xff08;部分失败 savepoint&#xff09;&#xff09; C 一致性 &#xff08;事务开始时数据状态&#xff0c…

Apache解析漏洞(apache_parsingCVE-2017-15715)

apache_parsing 到浏览器中访问网站 http://8.155.8.239:81/ 我们写一个木马 1.php.jpg 我们将写好的木马上传 会得到我们上传文件的路径 我们访问一下 发现上传成功 发现木马运行成功&#xff0c;接下来使用蚁剑连接我们的图片马 获取 shell 成功 CVE-2013-454 我们还是到…

CCF-GESP 等级考试 2023年9月认证C++二级真题解析

2023年9月真题 一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 正确答案&#xff1a;D 解析&#xff1a;考察知识点&#xff1a;计算机基础 本题属于考察计算机基础知识。中国第一台计算机通用数字电子计算机于 1958 年 6 月由中科院计算所研制成功。那时候的逻…

linux环境使用yum方式安装nginx

linux环境使用yum方式安装nginx 一、nginx官网 二、nginx安装 点击首页的 Docs 或者 install 都可以&#xff0c;最终都是进入到Installing nginx页面 因为安装的服务器环境是linux centos 所以选择 Installation on Linux下面 packages 跳转链接 点击packages后 最终会跳转…

CS 144 check6: buiding an IP router

Lecture Notes Exercises 路由器的任务是根据路由表转发接收到的数据报&#xff1a;路由表是一系列规则&#xff0c;用于指导路由器针对任何给定的数据报应如何进行转发。 发送出什么接口。下一跳的IP地址。 这个check的工作是实现一个路由器&#xff0c;它可以为任何给定的…

Android Studio IDE环境配置

​需要安装哪些东西&#xff1a; Java jdk Java Downloads | OracleAndroid Studio 下载 Android Studio 和应用工具 - Android 开发者 | Android DevelopersAndroid Sdk 现在的Android Studio版本安装时会自动安装&#xff0c;需要注意下安装的路径Android Studio插件…

时钟周期、机器周期及指令周期是什么关系?

组成原理中&#xff0c;时钟周期、机器周期和指令周期是三个至关重要的概念&#xff0c;它们共同定义了计算机执行指令的基本时间框架。本文将对这三个周期进行详细介绍&#xff0c;并展示它们的工作原理。 一、时钟周期&#xff08;Clock Cycle&#xff09; 定义与作用 主…

YOLOv8改进,YOLOv8引入Hyper-YOLO的MANet混合聚合网络+HyperC2Net网络

摘要 理论介绍 MANet 的目标是通过多种卷积操作的协同作用,提高特征提取能力,并加强梯度流动,从而提升模型在不同层次的特征表示和语义深度。MANet 结合了三种卷积变体,通过混合使用它们来提高视觉特征的多样性和信息流动性。 HyperC2Net 的主要目标是通过超图结构对多层次…

挑战一个月基本掌握C++(第六天)了解函数,数字,数组,字符串

一 C函数 函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数&#xff0c;即主函数 main() &#xff0c;所有简单的程序都可以定义其他额外的函数。 您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的&#xff0c;但在逻辑上&#xff…

vue的ElMessage的css样式不生效

我使用elementplus&#xff0c;是使用的用哪个单独引入的&#xff0c;然后表单校验时候警告的css不生效&#xff0c;就是这个效果 反复看视频的引入也没发现问题&#xff0c;后来才知道需要这个引入 import { ElMessage } from "element-plus"; import element-pl…

PromptGIP:Unifying lmage Processing as Visual Prompting Question Answering

“Unifying Image Processing as Visual Prompting Question Answering” 文章提出了一种名为 PromptGIP 的通用模型&#xff0c;将图像处理任务统一为视觉提示问答范式&#xff0c;在多个图像处理任务上展现出良好性能&#xff0c;为通用图像处理提供了新的思路和方法。 confe…

Windows服务器修复SSL/TLS协议信息泄露漏洞等...

为了保证生产环境的安全, 我们会定期对服务器进行漏洞扫描, 一般情况下我们都是使用Linux服务器, 某些情况会用到Windows服务器 出现SSL/TLS协议信息泄露漏洞问题一般情况下是远程连接使用了不安全的加密算法, 需要禁用这些加密算法 修复方法 从网络中查询修复方法又很多, 大…