Qwt源码解读之拾取操作类(一)

QT开发(十七)——QWT简介 QT开发——QWT简介 一、QWT简介 QWT,即Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目, 可生成各种统计图,是为具有技术专业背景的程序提供GUI组件和一组实用类,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或一组浮点数等方式提供, 输出方式可以是Curves(曲线),Slider(滚动条),Dials(... 阅读详情

Qwt提供了对图形的拾取操作。


QwtEventPattern类:Qwt事件模式的集合。QwtEventPattern为鼠标和键盘的输入引入了一个间接层。它们可以用不同的符号名称来表示,因此应用代码可以通过单独的设置映射关系进行配置。QwtEventPattern类在初始化时定义了鼠标键,键盘键对应Qt中鼠标和键盘枚举变量的映射关系。当然,我们也可以通过属性设置接口重新指定它们的对应关系。

QwtPicker类:继承自QwtEventPattern,提供了在一个部件(QWidget)上的选择(拾取)功能。

QwtPlotPicker类:继承自QwtPicker,是QwtPlotCanvas上量身定制的QwtPicker。

QwtPlotZoomer类:继承自QwtPlotPicker。QwtPlotZoomer类对一个Plot部件提供了缩放功能,并将每一个缩放状态保存至栈中,因此还可以随时撤销与恢复。

代码分析:

一、QwtEventPattern类:

QwtEventPattern类中定义了两个公有的嵌套类(也称嵌套类型,nested class):

    //! A pattern for mouse events
    class MousePattern
    {
    public:
        //! Constructor
        MousePattern( int btn = Qt::NoButton, int st = Qt::NoButton )
        {
            button = btn;
            state = st;
        }

        //! Button code
        int button;

        //! State
        int state;
    };

    //! A pattern for key events
    class KeyPattern
    {
    public:
        //! Constructor
        KeyPattern( int k = 0, int st = Qt::NoButton )
        {
            key = k;
            state = st;
        }

        //! Key code
        int key;

        //! State
        int state;
    };
因为该类型只在QwtEventPattern类中被用到,所以将其定义为QwtEventPattern的嵌套类。但又由于需要为这两个嵌套类定义全局的相等比较操作符函数,所以将它们定义为public访问权限。这样在全局作用域中就可以通过作用域限定符QwtEventPattern::对其进行引用。见下面代码:

//! Compare operator
inline bool operator==( QwtEventPattern::MousePattern b1,
    QwtEventPattern::MousePattern  b2 )
{
    return b1.button == b2.button && b1.state == b2.state;
}

//! Compare operator
inline bool operator==( QwtEventPattern::KeyPattern b1,
   QwtEventPattern::KeyPattern  b2 )
{
    return b1.key == b2.key && b1.state == b2.state;
}

二、QwtPicker类:

       QwtPicker类Qwt拾取机制中极为重要的一个类。Qwt文档对QwtPicker类有如下说明:

QwtPicker provides selections on a widget.

QwtPicker filters all enter, leave, mouse and keyboard events of a widget and translates them into an array of selected points.

The way how the points are collected depends on type of state machine that is connected to the picker. Qwt offers a couple of predefined state machines for selecting:

While these state machines cover the most common ways to collect points it is also possible to implement individual machines as well.

QwtPicker translates the picked points into a selection using the adjustedPoints method. adjustedPoints is intended to be reimplemented to fixup the selection according to application specific requirements. (F.e. when an application accepts rectangles of a fixed aspect ratio only.)

Optionally QwtPicker support the process of collecting points by a rubberband and tracker displaying a text for the current mouse position.

Example
#include <qwt_picker.h>
#include <qwt_picker_machine.h>

QwtPicker *picker = new QwtPicker(widget);
picker->setStateMachine(new QwtPickerDragRectMachine);
picker->setTrackerMode(QwtPicker::ActiveOnly);
picker->setRubberBand(QwtPicker::RectRubberBand); 

The state machine triggers the following commands:

  • begin()
    Activate/Initialize the selection.
  • append()
    Add a new point
  • move() 
    Change the position of the last point.
  • remove()
    Remove the last point.
  • end()
    Terminate the selection and call accept to validate the picked points.

The picker is active (isActive()), between begin() and end().In active state the rubberband is displayed, and the tracker is visible in case of trackerMode is ActiveOnly or AlwaysOn.

The cursor can be moved using the arrow keys. All selections can be aborted using the abort key.(QwtEventPattern::KeyPatternCode)

Warning:
In case of QWidget::NoFocus the focus policy of the observed widget is set to QWidget::WheelFocus and mouse tracking will be manipulated while the picker is active, or if  trackerMode() is AlwayOn.
代码分析:

1、构造函数:

/*!
  Constructor

  Creates an picker that is enabled, but without a state machine.
  rubberband and tracker are disabled.

  \param parent Parent widget, that will be observed
 */

QwtPicker::QwtPicker( QWidget *parent ):
    QObject( parent )
{
    init( parent, NoRubberBand, AlwaysOff );
}
注意:1)没有状态机。因此需要通过setStateMachine( QwtPickerMachine * sm)进行设置。

            2)rubberband and tracker are disabled.

2、设置状态机:

/*!
  Set a state machine and delete the previous one

  \param stateMachine State machine
  \sa stateMachine()
*/
void QwtPicker::setStateMachine( QwtPickerMachine *stateMachine )
{
    if ( d_data->stateMachine != stateMachine )
    {
        reset();

        delete d_data->stateMachine;
        d_data->stateMachine = stateMachine;

        if ( d_data->stateMachine )
            d_data->stateMachine->reset();
    }
}
说明:1)QwtPicker类和QwtPlotPicker类在实例化时,都没有初始化状态机,因此需要单独设置状态机。

            2)注意 setStateMachine( QwtPickerMachine * sm) 函数里的参数类型 QwtPickerMachine 是一个接口类,是所有其它状态机类型的抽象基类。这样我们就可以通过这个接口设置任意类型的状态机类型,包括我们自定义的状态机类型(只要它们是从QwtPickerMachine 派生而来)。 这个设计也充分印证了面向对象设计的一个原则:依赖倒置原则,即面向接口编程,而不是面向实现编程。

3、几个重要的函数接口: 

    virtual QRect pickRect() const;

    virtual void drawRubberBand( QPainter * ) const; // 绘制RubberBand,可以是横线,竖线,十字架,矩形,椭圆,多边形等多种形状
    virtual void drawTracker( QPainter * ) const; // 绘制显示鼠标点位置的(活动)标签(轨迹点文本)

    virtual QwtText trackerText( const QPoint &pos ) const; // 返回鼠标点的文本标签QwtText,通过重实现它可以实现不同样式的文本标签QwtText
    QPoint trackerPosition() const;
    virtual QRect trackerRect( const QFont & ) const;

    QPolygon selection() const; // 选择区域的多边形
4、QwtPicker类提供了丰富的属性设置接口,可以通过设置不同的属性得到漂亮满意的样式。此外,QwtPicker类还提供了几个重要的信号,为我们在拾取过程中捕获相关特征参数提供了方便。



QWT下载、安装、配置教程 一、关于Qt Creater的必要说明 1、 minGW版的Qt Creater和msvc版的Qt Creater区别: 至于你自己用的是哪一个版本的Qt Creater可以通过帮助about Qt Creater查看。 我这里用的是MSVC2017版本的。接下来说明两者的区别: minGW版Creator集成了编译器,不需要额外安装。MSVC版使用的是VS的编译器,需要额外安装VS,但官方提供的creator都是用MSVC编译(包括mingW版),所以关于Qt Creator的插件,必须使用MSVC编译, 阅读详情

相关推荐

【嵌入式——QT】QWT应用

QWT,全称Qt Widgets for Technical Applications,是一个基于Qt开发的第三方库。它主要为具有技术背景的程序提供GUI组件和一组实用类,用于生成各种统计图。QWT的主要功能包括二维绘图、刻度、滑块、刻度盘、罗盘、温度计、轮子和旋钮等,可用于控制或显示双精度类型的值、数组或范围。此外,QWT还支持任何Qt能够支持的系统环境,并兼容Qt4(4.4版本以上)和Qt5版本。在QWT的最新版本中,还提供了一些新的绘图控件以及对OpenGL的基本支持。

weixin_39723539的博客 1795

QT中Qwt、QChart、QCustomPlot使用与性能对比

QT中对比Qwt、QChart、QCustomPlot三个绘图库,qcustomplot在绘制大量点的二维曲线上性能优势明显,通过qcustomplot程序合理使用(包括开启硬件加速)及针对项目需求的优化,在实际项目应用中应用qcustomplot做到实时刷新曲线一千万点是没有问题的,甚至设计合理还能做到更高。 关键词:QT5绘图,QT6绘图,qcustomplot,qchart,QT绘图性能,qcustomplot绘图性能测试,qchart绘图性能测试;

热土程序园,利他愉己~ 9281

Halcon窗体开发避坑指南:C#自定义控件实现7大图像交互功能

本文详细介绍了如何利用C#封装自定义Halcon控件,以解决原生HWindowControl功能不足的问题。通过实战代码,展示了如何实现图像按比例显示、鼠标拖动缩放、灰度值读取、图像保存、截图及图形叠加等七大核心交互功能,并重点剖析了内存管理、坐标转换等开发避坑要点,帮助开发者构建稳定可复用的机器视觉组件库。

weixin_29251131的博客 292

Qwt开发教程(一)—配置及安装Qwt(最全、最详细)#F0220

Qwt 配置详细说明 本文原创作者:冯一川(ifeng12358@163.com),如有转载,请注明原作者及出处。 1、版本说明: 操作系统以windows7和windows10为例。 Qt版本以Qt 5.8.0 MSVC2015_64和 Qt 5.3 MinGW 32bit为例。 QWT版本以qwt-6.1.3为例 ...

ifeng12358的博客 1万+

推荐系统召回总结(持续更新)

推荐系统架构 候选池:可供推荐的物料候选池,对于图文、短视频、新闻等来说通常是最近N天的新物料组成的集合,定期进行物料更新。 召回:从候选池中选出和用户相关的物料,交给后面的排序模块进行打分。召回面对的候选集通常是数十万或者百万甚至千万的量级,检索过程必须轻量快速。通常由多路召回组成,保证不遗漏且相关性、多样性尽量好,可以分为非个性化召回和个性化召回。 粗排:对召回选择的几千或者几百候选物料进行排序,快速打分选出topN,减少精排的压力,兼顾精准与效率。 精排:对粗排的结果进行精准排序,这个环节需要特征尽可

whgyxy的博客 2515

【论文笔记】Beyond Low-frequency Information in Graph Convolutional Networks

文章目录1. Abstract2. Introduction低频和高频信号作用FAGCN怎么设计3. An Experimental Investigation4. Model4.1 filter定义4.2 Aggregation4.3 Problems of signal combination4.4 Spatial vision of FAGCN4.5 系数αijG\alpha_{i j}^{G}αijG​4.6 模型整体框架FAGCN的表达能力实验 本文发表在AAAI-21上 论文地址:https:

Running Snail 5602

Qwt源码解读之QwtPlotItem类(二)

Qwt框架提供了几种标准的图元实现。如网格(QwtPlotGrid类)、标签(QwtPlotMarker类)、标尺(QwtPlotScaleItem类)、显示SVG格式图形文件的图元(QwtPlotSvgItem类)、频谱图(QwtPlotSpectrogram类)、曲线(QwtPlotCurve类)、柱状图(QwtPlotHistogram类)、间隔区域(QwtPlotIntervalCurve...

lxj434368832的博客 2428

vislib_vex5:面向VEX V5的嵌入式视觉处理库

嵌入式视觉处理是机器人实时感知的核心能力,其本质是在资源受限环境下实现图像采集、色彩转换、阈值分割与目标定位的确定性流水线。原理上依赖硬件加速(如DMA2D)、定点运算优化与中断协同机制,以规避浮点开销和动态内存分配。技术价值在于提供亚毫秒级、无RTOS依赖、低延迟可预测的视觉基础能力,显著提升教育及竞赛机器人在动态场景下的响应鲁棒性。典型应用场景包括色块跟踪、目标居中控制、自动导航中的简易视觉伺服等。本文聚焦于专为VEX V5主控(STM32H743+图像协处理器)深度优化的轻量库vislib_vex5,

weixin_31185473的博客 606

Qwt源码解读之QwtPickerMachine类

Qwt为拾取操作提供了状态机设置,用于控制拾取操作的不同行为。 void setStateMachine( QwtPickerMachine * );其实现如下: /*! Set a state machine and delete the previous one \param stateMachine State machine \sa stateMachine() */ v

e5Max的专栏 3230

SAP 批次管理

批次管理: 业务场景: 批次常用于:采购、生产、SD等: 1、先进先出,先入库的先出库(如何实现),基于入库时间来自动确定出库策略。 2、追塑:基于批次进行产品质量追溯 例如订单MTO ---> PP ----> MM(批次关联)。SO—>PP工单 --> 预留 --> 发料(基于批次A\B\C)-->产成品入库-->批次入库D--> ...

willieyuan的博客 1万+

华为OD机试真题-国际移动用户识别码(IMSI)匹配

华为OD机试双机位C卷 国际移动用户识别码(IMSI)匹配 , 提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 国际移动用户识别码(IMSI)匹配

qq_45776114的博客 4925

Qwt源码解读之平移操作类

Qwt 提供了对图形部件的平移操作,其实就是在平移时,通过将图形绘制在另一个部件(QWidget)上实现了平移的效果(抓取)。这一切都是通过Qt的事件机制实现的。 QwtPanner类:提供平移操作,像QRubberBand一样,其也是QWidget的子类。QwtPanner类被QwtPlotPanner类继承,用于对QwtPlotCanvas进行平移操作。继承关系如下图所示: 先看一

e5Max的专栏 4681

数据资产可视化分析:PowerBI在大数据管理中的实战

目的:帮你搞懂“为什么数据资产需要可视化?”“PowerBI能帮企业解决什么问题?”,并掌握用PowerBI做大数据可视化的实战技巧。范围:覆盖数据资产定义、可视化分析原理、PowerBI核心功能(数据连接、建模、可视化)、零售企业实战案例,以及未来趋势与挑战。背景:为什么企业的数据像乱堆的玩具?核心概念:数据资产、可视化分析、PowerBI分别是什么?它们怎么配合?实战步骤:用PowerBI帮零售企业整理“销售玩具箱”,做出能指导决策的仪表盘;应用场景:不同部门怎么用这个“整理好的玩具箱”?

2501_92132293的博客 906

Qwt源码解读之标尺相关类

Qwt中添加标尺是非常方便和漂亮的。除了有普通的直尺外,还有环形标尺。这里我们先学习一下直尺的相关类。直尺的相关类共有下面几个: 1、QwtScaleMap:标尺值映射类。       QwtScaleMap类用于提供标尺坐标系与绘制设备坐标系之间的映射关系。其主要的功能依托 QwtScaleTransformation 类来实现。 2、QwtScaleDiv:标尺刻度划分类。

e5Max的专栏 9331

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Qwt源码解读之开篇记

最近突然有一种想研究Qwt源码的想法,一来通过解读源码深入学习Qwt库,掌握如何扩展一个库;二来通过对开源库源码的研究,向大师学习一些编程习惯和设计技巧。        Qwt全称是Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目,可用来绘制各种统计图。目前版本为Qwt-6.0.1。http://qwt.sourceforge.ne

e5Max的专栏 4577

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Qwt源码解读之QwtInterval 类

QwtInterval 类表征一个区间,这个区间由两个double类型的上限值max和下限值min所表示。它可以表示[min, max],[min, max),(min, max]和(min, max) 等4种情况。 代码分析: [cpp] view plain copy class QWT_EXPORT QwtInterval   { 

king16304的博客 1298

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Qwt源码解读之QwtIntervalSample类和QwtSetSample类

QwtIntervalSample类表征一个区间样点,即(dx, y)或者 (x, dy) [A sample of the types (x1-x2, y) or (x, y1-y2)]。 代码分析: [cpp] view plain copy //! \brief A sample of the types(x1-x2,y)or(x,y

king16304的博客 885

Qwt源码解读之缩放操作类

Qwt提供了自己的缩放机制。     QwtMagnifier类:提供逐步放大缩小功能的抽象基类。被QwtPlotMagnifier继承。继承关系如下图所示: 代码分析: 一、QwtMagnifier类 1、构造函数: /*! Constructor \param parent Widget to be magnified */ QwtMagnifier::Qwt

e5Max的专栏 8894

Qwt源码解读之拾取操作类(二)

三、QwtPlotPicker类: QwtPlotPicker provides selections on a plot canvas. QwtPlotPicker is a QwtPicker tailored for selections on a plot canvas.It is set to a x-Axis and y-Axis and translates al

e5Max的专栏 5572

Qwt源码解读之QwtText类和QwtTextLabel类

QwtText类表征Qwt中的一段文本。与QString相比,QwtText包含了一系列怎样渲染文本的属性特征。通过指定这些属性,你可以绘制各种各样的文本样式。 代码分析: 1、接口示例: double heightForWidth( double width, const QFont & = QFont() ) const; // 根据指定的宽度给出最合适的高度 QSiz

e5Max的专栏 5349

Qwt源码解读之QwtPainter类

QwtPainter类提供了QPainter类相关方法的集合,主要是对QPainter诸多方法的包装。 代码分析: 1)QwtPainter类定义了两个静态属性数据: private: static bool d_polylineSplitting; static bool d_roundingAlignment;  在cpp文件中对其进行了初始化: bool

e5Max的专栏 2630

状态状态机Qwt源码解读之QwtPickerMachine类

上班之余抽点时间出来写写博文,希望对新接触的朋友有帮助。今天在这里和大家一起学习一下状态状态机 Qwt为拾取操纵供给了状态机置设,用于制控拾取操纵的不同行为。 void setStateMachine( QwtPickerMachine * ); 其实现如下: /*! Set a state machine and delete the previous o...

weixin_30709635的博客 122

Qwt源码解读之QwtSystemClock类和QwtSamplingThread类

QwtSystemClock类提供了一个高分辨率的时钟功能(依赖于特定的系统)。 代码分析: [cpp] view plain copy class QWT_EXPORT QwtSystemClock   {   public:       QwtSystemClock();       virtual ~QwtSystemCloc

king16304的博客 594
上一篇: Qwt源码解读之平移操作类
下一篇: Qwt源码解读之拾取操作类(二)
e5Max
博客等级 码龄14年 145粉丝 129原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值