Qt详解QHoverEvent、QTouchEvent、QGestureEvent与QTabletEvent事件

news2024/9/9 1:01:07

文章目录

  • 前言
      • QHoverEvent
        • 方法
        • 常用函数
        • 示例
      • QTouchEvent
        • 方法
        • 常用函数
        • 示例
      • QGestureEvent
        • 方法
        • 常用函数
        • 示例
      • QTabletEvent
        • 方法
        • 常用函数
        • 示例
  • 总结


前言

在现代应用程序中,用户交互方式多种多样,除了传统的鼠标和键盘外,还包括触摸屏、手势、手写板等多种输入方式。Qt 作为一个功能强大的跨平台应用框架,提供了丰富的事件处理机制,帮助开发者轻松实现复杂的用户交互功能。本文将详细介绍 QHoverEventQTouchEventQGestureEventQTabletEvent 的功能和使用方法,帮助开发者更好地理解和应用这些事件处理机制,从而构建出更为流畅和直观的用户界面。


QHoverEvent

QHoverEvent 处理鼠标悬停事件,包括鼠标进入悬停区域、离开悬停区域以及在悬停区域移动。

方法
  • hoverEnter(QHoverEvent *event):鼠标进入悬停区域时触发。
  • hoverLeave(QHoverEvent *event):鼠标离开悬停区域时触发。
  • hoverMove(QHoverEvent *event):鼠标在悬停区域移动时触发。
常用函数
  • QPoint pos() const

    • 作用:返回事件触发点的局部坐标。
    • 参数:无。
    • 返回值:局部坐标。
  • QPoint oldPos() const

    • 作用:返回鼠标上一次的位置。
    • 参数:无。
    • 返回值:上一次的位置。
示例
#include <QApplication>
#include <QWidget>
#include <QHoverEvent>

class MyWidget : public QWidget
{
public:
    MyWidget()
    {
        setAttribute(Qt::WA_Hover, true);
    }

protected:
    void hoverEnter(QHoverEvent *event) override
    {
        // 处理鼠标进入悬停区域的逻辑
    }

    void hoverLeave(QHoverEvent *event) override
    {
        // 处理鼠标离开悬停区域的逻辑
    }

    void hoverMove(QHoverEvent *event) override
    {
        // 处理鼠标在悬停区域移动的逻辑
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MyWidget widget;
    widget.show();

    return app.exec();
}

QTouchEvent

QTouchEvent 处理触摸屏事件,包括多点触控操作。

方法
  • touchEvent(QTouchEvent *event):触摸事件。
常用函数
  • QList<QTouchEvent::TouchPoint> touchPoints() const

    • 作用:返回当前的触摸点列表。
    • 参数:无。
    • 返回值:触摸点列表。
  • Qt::TouchPointStates touchPointStates() const

    • 作用:返回触摸点的状态。
    • 参数:无。
    • 返回值:触摸点状态。
示例
#include <QApplication>
#include <QWidget>
#include <QTouchEvent>
#include <QDebug>

class MyWidget : public QWidget
{
public:
    MyWidget()
    {
        setAttribute(Qt::WA_AcceptTouchEvents, true);
    }

protected:
    void touchEvent(QTouchEvent *event) override
    {
        QList<QTouchEvent::TouchPoint> touchPoints = event->touchPoints();
        foreach (const QTouchEvent::TouchPoint &touchPoint, touchPoints) {
            qDebug() << "Touch point ID:" << touchPoint.id() << "Pos:" << touchPoint.pos();
        }
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MyWidget widget;
    widget.show();

    return app.exec();
}

QGestureEvent

QGestureEvent 处理手势事件,例如捏合、滑动等。

方法
  • gestureEvent(QGestureEvent *event):手势事件。
常用函数
  • QGesture *gesture(Qt::GestureType type) const

    • 作用:返回指定类型的手势。
    • 参数type - 手势类型。
    • 返回值:手势对象。
  • QList<QGesture *> gestures() const

    • 作用:返回当前的手势列表。
    • 参数:无。
    • 返回值:手势列表。
示例
#include <QApplication>
#include <QWidget>
#include <QGestureEvent>
#include <QPinchGesture>
#include <QSwipeGesture>

class MyWidget : public QWidget
{
public:
    MyWidget()
    {
        grabGesture(Qt::PinchGesture);
        grabGesture(Qt::SwipeGesture);
    }

protected:
    bool event(QEvent *event) override
    {
        if (event->type() == QEvent::Gesture) {
            return gestureEvent(static_cast<QGestureEvent*>(event));
        }
        return QWidget::event(event);
    }

    bool gestureEvent(QGestureEvent *event) override
    {
        if (QGesture *swipe = event->gesture(Qt::SwipeGesture)) {
            // 处理滑动手势
        }
        if (QGesture *pinch = event->gesture(Qt::PinchGesture)) {
            // 处理捏合手势
        }
        return true;
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MyWidget widget;
    widget.show();

    return app.exec();
}

QTabletEvent

QTabletEvent 处理手写板事件,通常用于支持手写输入或绘图板。

方法
  • tabletEvent(QTabletEvent *event):手写板事件。
常用函数
  • QPointF pos() const

    • 作用:返回事件触发点的局部坐标。
    • 参数:无。
    • 返回值:局部坐标。
  • QPointF globalPos() const

    • 作用:返回事件触发点的全局坐标。
    • 参数:无。
    • 返回值:全局坐标。
  • int device() const

    • 作用:返回手写板设备的类型。
    • 参数:无。
    • 返回值:设备类型。
  • qreal pressure() const

    • 作用:返回压力感应值。
    • 参数:无。
    • 返回值:压力值。
示例
#include <QApplication>
#include <QWidget>
#include <QTabletEvent>
#include <QPainter>

class MyWidget : public QWidget
{
public:
    MyWidget()
    {
        setAttribute(Qt::WA_StaticContents);
    }

protected:
    void tabletEvent(QTabletEvent *event) override
    {
        if (event->type() == QEvent::TabletPress || event->type() == QEvent::TabletMove) {
            QPainter painter(this);
            painter.setPen(QPen(Qt::black, event->pressure() * 10));
            painter.drawPoint(event->pos());
        }
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MyWidget widget;
    widget.show();

    return app.exec();
}

总结

通过详细介绍QHoverEventQTouchEventQGestureEventQTabletEvent 的功能、重载函数及常用方法,可以看出 Qt 为处理复杂的用户交互提供了强大的支持。这些事件处理机制不仅提升了应用程序的交互性,也为开发者提供了灵活的工具,以实现更为丰富的用户体验。希望本文能帮助开发者更好地理解和应用这些事件处理机制,从而构建出更为流畅和直观的用户界面。

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

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

相关文章

pdf太大怎么压缩大小?这几种压缩方法操作起来很简单!

pdf太大怎么压缩大小&#xff1f;在数字化洪流席卷的当下&#xff0c;PDF文件的“臃肿”难题如同巨石般横亘于高效办公之路&#xff0c;它们不仅贪婪地吞噬着宝贵的存储空间&#xff0c;更如沉重的枷锁&#xff0c;拖曳着我们的工作进度&#xff0c;步入迟缓之境&#xff0c;试…

06 内置的整数、实数与复数

在 Python 中&#xff0c;内置的数字类型有整数、实数和复数&#xff0c;借助于标准库 fractions 中的 Fraction 对象可以实现分数及其运算&#xff0c;而 fractions 中的 Decimal 类则实现了更高精度的运算。 Python 支持任意大的数字&#xff0c;具体可以大到什么程度仅受内…

电阻液冷 可提升 3.3kV 中压负载-EAK水冷电阻器

电阻液冷 可提升 3.3kV 中压负载-EAK水冷电阻器 在工业和海洋应用中&#xff0c;水冷在削减电阻器封装方面至关重要的地方 在起重机、升降机、升降机和输送机等电机驱动应用中&#xff0c;风冷电阻器很常见&#xff0c;但在中压、高功率应用中&#xff0c;液体冷却胜出。 使…

IDEA项目的依赖(pom.xml文件)导入问题及解决

前言&#xff1a;该文章为转载&#xff0c;没有仔细的看 IDEA新建项目和pom.xml文件被修改时&#xff0c;右下角都会出现 Maven projects need to be imported&#xff08;项目需要导入依赖&#xff09; 如下&#xff0c;点击 Import Changes导入后&#xff0c;有时会一直处于…

【基础篇】Docker 概览 ONE

嗨&#xff0c;大家好&#xff01;我是小竹笋&#xff0c;一名热爱创作的工程师。今天我将带领大家一起踏上探索 Docker 的奇妙之旅。我们先从 Docker 的历史和发展说起&#xff0c;然后再看看 Docker 和虚拟机之间的区别&#xff0c;最后了解一下 Docker 在各行各业的应用情况…

数据结构算法经典题目刨析(c语言)返回单链表的倒数第 k 个节点

&#x1f493; 博客主页&#xff1a;C-SDN花园GGbond ⏩ 文章专栏&#xff1a;数据结构经典题目刨析(c语言) 一.题目描述 二.解题思路 方法一:计数器方式 先遍历链表&#xff0c;求出链表长度count倒数第k个节点&#xff0c;就是正数第count-k1个节点&#xff08;下标为count…

《系统架构设计师教程(第2版)》第13章-层次式架构设计理论与实践-02-表现层框架设计

文章目录 1. 表现层设计模式1.1 MVC模式1.1.1 三个核心模块1&#xff09;控制器 (Controller)2&#xff09;模型 (Model)3&#xff09;视图 (View): 1.1.2 过程1.1.3 优点1.1.4 应用 1.2 MVP模式1.3 MVVM模式 2. 使用XML设计表现层统一Web Form与 Windows Form的外观3. 表现层中…

⚠️ Buffer Overflow: 安全编码必备知识 ️

⚠️ Buffer Overflow: 安全编码必备知识 &#x1f6e1;️ ⚠️ Buffer Overflow: 安全编码必备知识 &#x1f6e1;️摘要引言正文内容一、缓冲区溢出基本概念 &#x1f9e9;二、常见场景及实际案例 &#x1f6e0;️2.1 利用不安全的函数2.2 堆溢出攻击 三、调试技巧 &#x1f…

算法入门:Java实现排序、查找算法

链接&#xff1a;算法入门&#xff1a;Java实现排序、查找算法 (qq.com) 冒泡/选择/插入/希尔排序代码 (qq.com) 快排/归并/堆排/基数排序代码 (qq.com)

Python酷库之旅-第三方库Pandas(053)

目录 一、用法精讲 196、pandas.Series.first方法 196-1、语法 196-2、参数 196-3、功能 196-4、返回值 196-5、说明 196-6、用法 196-6-1、数据准备 196-6-2、代码示例 196-6-3、结果输出 197、pandas.Series.head方法 197-1、语法 197-2、参数 197-3、功能 1…

【C++题解】1069. 字符图形5-星号梯形

问题&#xff1a;1069. 字符图形5-星号梯形 类型&#xff1a;嵌套循环、图形输出 题目描述&#xff1a; 打印字符图形。 输入&#xff1a; 一个整数&#xff08; 0<n<10 &#xff09;。 输出&#xff1a; 一个字符图形。 样例&#xff1a; 输入&#xff1a; 3输…

卷积神经网络(三)---案例分析

上面部分介绍了 PyTorch 中的卷积模块&#xff0c;接下来将会介绍几个卷积神经网络的案例&#xff0c;通过案例入手来介绍卷积神经网络的结构设计。 1. LeNet LeNet 是整个卷积神经网络的开山之作&#xff0c;1998年由 LeCun 提出&#xff0c;它的结构特别简单&#xff0c;我们…

看懂循环队列

循环队列的设计过程 1.循环队列2.设计循环队列的逻辑过程2.1 定义循环队列的数据结构2.2 初始化队列2.3 入队操作2.4. 出队操作2.5 判断队列状态2.5 获取队头和队尾的元素力扣相关题目完整代码 1.循环队列 循环队列是使用有限数组来模拟队列&#xff0c;与普通的队列不同的是&…

文献综述在确定先前研究中使用的方法学方法方面发挥什么作用

VersaBot一键生成文献综述 文献综述在确定先前研究中使用的方法学方法方面发挥着至关重要的作用&#xff0c;可以作为设计自己的方法论并证明其重要性的基础。就是这样; 1. 揭示现有方法&#xff1a; 通过探索与您的主题相关的研究&#xff0c;您将发现其他研究人员采用的不同…

普通人有必要学Python吗?学了之后能做什么?

目录 首先来说一下极其推荐的方向&#xff1a; 1、数据分析 2、科学计算 3、大数据框架 4、脚本开发 5、爬虫 6、Web框架 总结&#xff1a; 如果你还没有开始使用Python&#xff0c;答应我&#xff0c;把这个回答看完&#xff0c;如果你真的学习并深入使用过Python&…

锅总浅析虚拟化技术

常见的虚拟化技术有哪些&#xff1f;KVM集群解决方案有哪些&#xff1f;如何用Libvirt操作KVM组成集群&#xff1f;PVE构建虚拟化的特性和其架构又是怎样的&#xff1f;希望完本文&#xff0c;能帮您解答这些疑惑&#xff01; 一、常见虚拟化技术概述 虚拟化技术是一种通过软…

Qt 实现抽屉效果

1、实现效果和UI设计界面 2、工程目录 3、mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QToolButton> #include <QPushButton> #include <vector> using namespace std;QT_BEGIN_NAMESPACE namespace…

前后端分离开发遵循接口规范-YAPI

目前&#xff0c;网站主流开发方式是前后端分离。因此前后端必须遵循一套统一的规范&#xff0c;才能保证前后端进行正常的数据&#xff08;JSON数据格式&#xff09;请求、影响&#xff0c;这套规范即是 YAPI. 产品经理撰写原型&#xff1b; 前端或后端撰写接口文档。 YAPI…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《计及联盟合作成本的新能源场站共享储能优化配置策略》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…