qwt 之 QwtPlotPicker

news2024/12/22 11:21:41

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 用于平移功能。

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

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

相关文章

在window环境下安装openssl生成钥私、证书和签名,nodejs利用express实现ssl的https访问和测试

在生成我们自己的 SSL 证书之前&#xff0c;让我们创建一个简单的 Express应用程序。 要创建一个新的 Express 项目&#xff0c;让我们创建一个名为node-ssl -server 的目录&#xff0c;用终端cmd中进入node-ssl-server目录。 cd node-ssl-server 然后初始化一个新的 npm 项目…

Webpack学习笔记(5)

1.拆分开发环境和生产环境配置 很多配置在开发环境和生产环境存在不一致的情况&#xff0c;比如开发环境没有必要设置缓存&#xff0c;生产环境需要设置公共路径等等。 2.公共路径 使用publicPath配置项&#xff0c;可以通过它指定应用程序中所有资源的基础路径。 webpack.…

桌面图形界面生成原理:从流水灯到电脑屏幕

桌面图形界面是我们在使用电脑时接触最多的一个部分。它的美观、简洁、易用都给我们的生活带来了极大的便利。但是&#xff0c;你是否想过&#xff0c;这样的界面是如何生成的呢&#xff1f;让我们从流水灯的原理开始&#xff0c;一步步揭开桌面图形界面生成的奥秘。 一、流水…

html+css网页设计 美食 百味美食4个页面

htmlcss网页设计 美食 百味美食4个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#xf…

WPF DataTemplate 数据模板

DataTemplate 顾名思义&#xff0c;数据模板&#xff0c;在 wpf 中使用非常频繁。 它一般用在带有 DataTemplate 依赖属性的控件中&#xff0c;如 ContentControl、集合控件 ListBox、ItemsControl 、TabControls 等。 1. 非集合控件中使用 <UserControl.Resources>&l…

【CSS in Depth 2 精译_084】第 14 章:CSS 蒙版、形状与剪切概述 + 14.1:CSS 滤镜

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 14 章 蒙版、形状与剪切】 ✔️ 14.1 滤镜 ✔️ 14.1.1 滤镜的类型 ✔️14.1.2 背景滤镜 ✔️ 14.2 蒙版 文章目录 第 14 章 蒙版、形状与剪切 Masks, shapes, and…

excel 使用vlook up找出两列中不同的内容

当使用 VLOOKUP 函数时&#xff0c;您可以将其用于比较两列的内容。假设您要比较 A 列和 B 列的内容&#xff0c;并将结果显示在 C 列&#xff0c;您可以在 C1 单元格中输入以下公式&#xff1a; 这个公式将在 B 列中的每个单元格中查找是否存在于 A 列中。如果在 A 列中找不到…

java_章节作业

第1题 package com.hspedu.homework;/*** author:寰愬悏瓒&#xfffd;* date:2024/12/19 version:1.0*/ public class Homework01 {public static void main(String[] args) {//初始化Person对象数组&#xff0c;有3个Person对象&#xff1b;Person[] persons new Person[3];…

20241217使用M6000显卡在WIN10下跑whisper来识别中英文字幕

20241217使用M6000显卡在WIN10下跑whisper来识别中英文字幕 2024/12/17 17:21 缘起&#xff0c;最近需要识别法国电影《地下铁》的法语字幕&#xff0c;使用 字幕小工具V1.2【whisper套壳/GUI封装了】 无效。 那就是直接使用最原始的whisper来干了。 当你重装WIN10的时候&#…

Fiddler勾选https后google浏览器网页访问不可用

一、说明 最近电脑重新安装系统后&#xff0c;之前的所有工具都需要重新安装和配置&#xff0c;有个项目需要抓包https包查看一下请求的内容&#xff0c;通过Fiddler工具&#xff0c;但是开启后&#xff0c;发现https的无法抓取&#xff0c;同时google浏览器也不无法访问互联网…

OpenAI 12天发布会(12 Days of OpenAI)总结

在OpenAI的“12 Days of OpenAI”活动中&#xff0c;每一天都会发布新的功能或技术&#xff0c;展示公司在AI领域的最新进展。首先展示下全部功能发布完成后&#xff0c;现在ChatGPT的界面&#xff1a; 以下是每一天的简要概述及其意义&#xff1a; 第1天 - 完整版O1模型 今天…

LLaMA-Factory 单卡3080*2 deepspeed zero3 微调Qwen2.5-7B-Instruct

环境安装 git clone https://gitcode.com/gh_mirrors/ll/LLaMA-Factory.git 下载模型 pip install modelscope modelscope download --model Qwen/Qwen2.5-7B-Instruct --local_dir /root/autodl-tmp/models/Qwen/Qwen2.5-7B-Instruct 微调 llamafactory-cli train \--st…

Vue3组件封装技巧与心得

摘要&#xff1a; 日常开发中&#xff0c;用Vue组件进行业务拆分&#xff0c;代码解耦是一个很好的选择&#xff1b; 今天就来分享一下我在使用Vue3进行组件封装的一些技巧和心得&#xff0c;希望能够帮助到大家&#xff1b; 1. 组件特性&#xff1a; 在Vue中组件是一个独立的…

图漾相机-ROS1_SDK_ubuntu版本编译(新版本)

文章目录 官网编译文档链接官网SDK下载链接1、下载 Camport ROS1 SDK1.下载git2、下载链接 2、准备编译工作1、安装 catkin2、配置环境变量3. 将Camport3中的linux库文件拷贝到 user/lib目录下4、修改lunch文件制定相机&#xff08;可以放在最后可以参考在线文档&#xff09;**…

十二、从0开始卷出一个新项目之瑞萨RZN2L 基于IAR coremark fsp200工程构建和iar icf链接文件修改方法

目录 一、概述 二、rzn2l_fsp2.0.0_coremark工程构建 2.1 目录结构 2.2 项目一览 2.3 iar工程打开报错如何处理 三、代码优化的问题 3.1 system.c中复制内存 3.2 iar代码优化等级与volatile关键字 3.3 iar配置优化单个文件与预编译宏的范围 四、iar .icf链接文件修改…

内容与资讯API优质清单

作为开发者&#xff0c;拥有一套API合集是必不可少的。这个开发者必备的API合集汇集了各种实用的API资源&#xff0c;为你的开发工作提供了强大的支持&#xff01;无论你是在构建网站、开发应用还是进行数据分析&#xff0c;这个合集都能满足你的需求。你可以通过这些免费API获…

线程知识总结(二)

本篇文章以线程同步的相关内容为主。线程的同步机制主要用来解决线程安全问题&#xff0c;主要方式有同步代码块、同步方法等。首先来了解何为线程安全问题。 1、线程安全问题 卖票示例&#xff0c;4 个窗口卖 100 张票&#xff1a; class Ticket implements Runnable {priv…

多智能体/多机器人网络中的图论法

一、引言 1、网络科学至今受到广泛关注的原因&#xff1a; &#xff08;1&#xff09;大量的学科&#xff08;尤其生物及材料科学&#xff09;需要对元素间相互作用在多层级系统中所扮演的角色有更深层次的理解&#xff1b; &#xff08;2&#xff09;科技的发展促进了综合网…

OB删除1.5亿数据耗费2小时

目录 回顾&#xff1a;mysql是怎么删除数据的&#xff1f; 删除方案 代码实现 执行结果 结论 本篇是实际操作 批量处理数据以及线程池线程数设置 记录学习 背景&#xff1a;有一张用户标签表&#xff0c;存储数据量达4个亿&#xff0c;使用OceanBase存储&#xff0c;由于…

简洁IIC协议讲述

目录 一&#xff1a;首先&#xff0c;IIC传输是在2条线上传输的。 二&#xff1a;时钟信号的频率和占空比解释&#xff08;可以看作PWM波形&#xff09; 三&#xff1a;传输信号的流程图&#xff08;起始和终止信号都是由主机(我)控制&#xff09; 四&#xff1a;开始信号和…