4. QT中的鼠标键盘事件 --- 鼠标拖拽案例

news2024/10/2 14:26:08

1. 说明

在QT的控件或者窗口当中,如果对于当前鼠标或者键盘的功能需要自己定义,可以重写父类当中对应虚函数,主要包括以下几个:

//键盘按键按下
virtual void keyPressEvent(QKeyEvent *event);
//键盘按键抬起
virtual void keyReleaseEvent(QKeyEvent *event);
//鼠标离开
virtual void leaveEvent(QEvent *event);
//鼠标双击
virtual void mouseDoubleClickEvent(QMouseEvent *event);
//鼠标移动
virtual void mouseMoveEvent(QMouseEvent *event);
//鼠标按下
virtual void mousePressEvent(QMouseEvent *event);
//鼠标抬起
virtual void mouseReleaseEvent(QMouseEvent *event);
//鼠标滚轮事件
virtual void wheelEvent(QWheelEvent *event);

2. 相关代码

使用鼠标移动时,需要在构造函数中开启鼠标追踪

this->setMouseTracking(true);

键盘响应代码:

void Widget::keyPressEvent(QKeyEvent *event)
{
    switch (event->key()) {
    case Qt::Key_W:
        qDebug()<<"模型前进...";
        break;
    case Qt::Key_S:
        qDebug()<<"模型后退...";
        break;
    case Qt::Key_A:
        qDebug()<<"模型向左...";
        break;
    case Qt::Key_D:
        qDebug()<<"模型向右...";
        break;
    default:
        break;
    }
}

void Widget::keyReleaseEvent(QKeyEvent *event)
{
    switch (event->key()) {
    case Qt::Key_W:
        qDebug()<<"模型停止前进...";
        break;
    case Qt::Key_S:
        qDebug()<<"模型停止后退...";
        break;
    case Qt::Key_A:
        qDebug()<<"模型停止向左...";
        break;
    case Qt::Key_D:
        qDebug()<<"模型停止向右...";
        break;
    default:
        break;
    }
}

鼠标按键响应事件:

void Widget::enterEvent(QEvent *event)
{
    Q_UNUSED(event);
    qDebug()<<"鼠标进入...";
}

void Widget::leaveEvent(QEvent *event)
{
    Q_UNUSED(event);
    qDebug()<<"鼠标离开...";
}

void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{
    //判断鼠标按键类型
    if(event->button() == Qt::LeftButton){
        qDebug()<<event->pos();
        qDebug()<<"鼠标双击...";
    }
    
}

3. 鼠标位置

QMouseEvent中有两种获取鼠标位置的函数,相关解释如下:

void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{
    //判断鼠标按键类型
    if(event->button() == Qt::LeftButton){
        
        qDebug()<<event->pos();//输出的是鼠标在相对于本控件左上角的位置
        
        qDebug()<<event->globalPos();//输出的是鼠标相对于整个显示器窗口左上角的位置
        
        qDebug()<<"鼠标双击...";
    }
}

案例:鼠标拖动图片移动
相关位置计算辅助记忆:
在这里插入图片描述
在Qt中显示一张图片,是使用QLabel控件来装载QPixmap图像源,如果图片控件需要支持鼠标的拖拽移动,需要自己定义一个控件,然后重新其父类的鼠标控制相关函数。
所以,先定义一个C++的类,继承QLabel,重写其 mousePressEvent 和 mouseMoveEvent 类,相关代码如下:
ImageLabel.h:

#ifndef IMAGELABEL_H
#define IMAGELABEL_H

#include <QObject>
#include <QLabel>
#include <QWidget>
#include <QPixmap>

class ImageLabel : public QLabel
{
    Q_OBJECT
public:
    explicit ImageLabel(const QPixmap &pix,QWidget* parent = nullptr);

    //重写虚函数
    virtual void mousePressEvent(QMouseEvent* event) override;
    virtual void mouseMoveEvent(QMouseEvent* event) override;
    //重写键盘控制函数
    virtual void keyPressEvent(QKeyEvent* event) override;

private:
    QPoint mousePressPos;//鼠标点击位置
    int mSpeed;//控制移动速度
	
signals:

};

#endif // IMAGELABEL_H

ImageLabel.cpp:

#include "imagelabel.h"
#include <QMouseEvent>

ImageLabel::ImageLabel(const QPixmap &pix, QWidget *parent)
{
    //设置图像源
    this->setPixmap(pix);
    //设置父控件
    this->setParent(parent);
    //设置图像比例填充
    this->setScaledContents(true);
    this->mSpeed = 10;
    //处理键盘事件需要先获取焦点
    this->setFocusPolicy(Qt::StrongFocus);
}

void ImageLabel::mousePressEvent(QMouseEvent *event)
{
    //记录鼠标开始点击时的初始位置向量
    mousePressPos = event->pos();
}

void ImageLabel::mouseMoveEvent(QMouseEvent *event)
{
    //求鼠标移动偏移量(向量)
    QPoint deltaMove = event->pos() - mousePressPos;
    //此时鼠标移动了,但是控件本身位置还没有加上偏移量,还未移动
    //求窗口新位置(当前位置 + 偏移量)
    this->move(this->pos() + deltaMove);
}
void ImageLabel::keyPressEvent(QKeyEvent *event)
{
    qDebug()<<"123";
    switch (event->key()) {
        case Qt::Key_W:{
            QPoint pos = this->pos() + QPoint(0,-1) * mSpeed;
            this->move(pos);
            break;
        }
        case Qt::Key_S:{
            QPoint pos = this->pos() + QPoint(0,1) * mSpeed;
            this->move(pos);
            break;
        }
        case Qt::Key_A:{
            QPoint pos = this->pos() + QPoint(-1,0) * mSpeed;
            this->move(pos);
            break;
        }
        case Qt::Key_D:{
            QPoint pos = this->pos() + QPoint(1,0) * mSpeed;
            this->move(pos);
            break;
        }
    }

}

然后再在主窗口中使用自定义类创建图片控件即可:

//使用label在窗口上添加一个图片
QPixmap piximg(":/imgs/images/tt.png");
ImageLabel *imgLab = new ImageLabel(piximg,this);
imgLab->move(50,100);//定义初始位置

效果展示:

鼠标键盘移动自定义控件

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

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

相关文章

为什么C++这么复杂还不被淘汰?

C是一门广泛使用的编程语言&#xff0c;主要用于系统和应用程序的开发。尽管C具有一些复杂的语法和概念&#xff0c;但它仍然是编程界的重量级选手&#xff0c;在编程语言排行榜中一直位居前列。为什么C这么复杂还不被淘汰呢&#xff1f; C有以下优势 1、C具有高性能 C是一门编…

unity进阶学习笔记:photonServer测试

photonServer是由photon发布的一个网络框架&#xff0c;其封装了UDP和TCP通信机制让用户可以直接调用API实现网络游戏通信 1 photonServer下载安装 进入Photon官网的SDK选项&#xff0c;选择下载Server。目前Server版本已经更新到v5&#xff0c;这里我为了和教程保持一致下载…

Unittest接口测试生成报告和日志方法

HTML报告 直接把HTMLTestRunner.py放入工程目录即可报告脚本封装 #HTNL格式报告now datetime.datetime.now().strftime(%Y-%m-%d_%H_%M_%S)htmlreport reportpath "/" now r"result.html"print("测试报告生成地址&#xff1a;%s"% htmlre…

Revit干货 | 系统族、内建族、可载入族一次性搞清楚!

对于使用人数较多的revit软件&#xff0c;其中的许多概念与我们常用的CAD完全不同&#xff0c;以至于让许多工程师觉得revit软件有点高深莫测&#xff0c;不可琢磨&#xff0c;从而有了抗拒心理。 Revit软件中的重要概念&#xff1a; “族”是revit软件中的很重要也很基本的概念…

程序的各种段以及堆栈相关问题

C中一般有三种变量&#xff1a; 局部变量全局变量静态变量 C中一般有五个内存段&#xff1a; 代码段 也叫文本段&#xff0c;包含frequently executed code通常是只读的&#xff08;未了避免程序被错误改写&#xff09;代码段是不包含程序变量&#xff08;如局部变量、全局变…

【数据结构】带头双向链表,真正的六边形战士

文章目录 概要整体架构流程小结 概要 *数据结构中的链表在实际开发中应用非常广泛&#xff0c;但写一个链表并不是一件简单的事情。链表有八种结构&#xff0c;对于刚入门的新手来说&#xff0c;往往会先经历单链表的折磨。 而今天我要讲的带头双向链表非常适合新手学习&#…

C++6.类和对象(下)

1.友元函数&#xff0c;一般现在类的最上面。 2.函数的参数中&#xff0c;如果不改变&#xff0c;尽量加上const修饰。 3.对于自定义类型&#xff0c;使用运算符进行操作基本上都要用运算符重载&#xff0c;但是有些运算符重载会默认自动生成。 4.初始化列表&#xff0c;是成…

【wpf】列表类,用相对源时,如何绑定到子项

前言 在之前的一篇文章 &#xff1a;《【wpf】深度解析&#xff0c;Binding是如何寻找数据源的》https://blog.csdn.net/songhuangong123/article/details/126195727#:~:text%E3%80%90wpf%E3%80%91%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%EF%BC%8CBinding%E6%98%AF%E5%A6%82%E4…

读书|林曦:她把自己的生活,过成了无用但丰盈的美学

时代在以加速度的方式变化&#xff0c;让人难以从容。而当我们陷于横向的比较系统&#xff0c;权衡着卷、躺、润时&#xff0c;也有人在探寻另一条纵向的路——向古人学习&#xff0c;以传统美学关照和滋养当下生活。      立夏之际&#xff0c;水墨画家林曦的新作《无用之…

33岁跳槽无路,濒临绝望之际受贵人指点,成功上岸阿里(测试岗)

写在前面 马上过34岁生日了&#xff0c;和大家聊聊最近的情况&#xff0c;半年前还在迷茫该学什么&#xff0c;怎样才能走出现在的困境&#xff0c;半年后已经成功上岸阿里&#xff0c;感谢在这期间帮助我的每一个人 开始 30多岁工作的时候总是有种力不从心的感觉&#xff0…

网络安全工程师需要考什么证吗?

目前网络安全行业&#xff0c;国内都有哪些证书可以考。 一、CISP-PTE &#xff08;国家注册渗透测试工程师&#xff09; CISP-PTE即注册信息安全渗透测试工程师&#xff0c;该证书由中国信息安全测评中心颁发&#xff0c;证书是国内唯一认可的渗透测试认证&#xff0c;专业性…

AIOps社区低代码项目火热报名中|中科院开源之夏2023,万元现金等你来拿!

活动介绍 开源之夏是由中科院软件所“开源软件供应链点亮计划”发起并长期支持的一项暑期开源活动&#xff0c;旨在鼓励在校学生积极参与开源软件的开发维护&#xff0c;培养和发掘更多优秀的开发者&#xff0c;促进优秀开源软件社区的蓬勃发展&#xff0c;助力开源软件供应链…

告别Excel,免费大数据分析与可视化工具,让你的论文图表“高大上”

数据分析工具很多&#xff0c;可以分为表格、数据库、BI工具、编程等四大工具。每个大类又有很多的工具&#xff0c;例如表格包括Excel、WPS、Google Sheets、Airtable等。编程工具包括Python和R。 搞科研几年了&#xff0c;笔者一直都是在使用Excel做数据分析和可视化&#xf…

Go语言中sync.Map、sync.Pool和Context的用法

目录 【sync.Map】 实现线程安全的 map 类型 使用 sync.Map 实现并发读写的map 【sync.Pool】 使用 带缓冲channel 实现对象池 使用 sync.Pool 创建临时对象池 【Context 上下文】 Context应用&#xff1a;实现带超时功能的远程调用 Context应用&#xff1a;监控指令…

电脑找不到MSVCR120.dll怎么办/MSVCR120.dll是什么?

电脑提示找不到MSVCR120.dll怎么办&#xff1f;你是否也遇到这个问题&#xff0c;MSVCR120.dll是什么文件呢&#xff1f;小编今天就把MSVCR120.dll文件丢失的修复方法给大家。msvcr120.dll是Microsoft Visual C 的一部分&#xff0c;它是Windows操作系统中的一个动态链接库文件…

计算卸载-论文05-双层优化(无线充电与卸载)

标题&#xff1a;《A Divide-and-Conquer Bilevel Optimization Algorithm for Jointly Pricing Computing Resources and Energy in Wireless Powered MEC》 期刊&#xff1a;IEEE TRANSACTIONS ON CYBERNETICS&#xff0c;2022 一、理论梳理 问题&#xff1a;相比于移动云…

基于Python长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析等领域中的应用

植被是陆地生态系统中最重要的组分之一&#xff0c;也是对气候变化最敏感的组分&#xff0c;其在全球变化过程中起着重要作用&#xff0c;能够指示自然环境中的大气、水、土壤等成分的变化&#xff0c;其年际和季节性变化可以作为地球气候变化的重要指标。此外&#xff0c;由于…

基于MAX-10 FPGA 读取超声波模块HC_SR04距离数据到数码管上

目录 实验现象简单介绍超声波测距模块HC_SR04模块框图模块编写测距信号源距离计算数码管模块顶层模块 总结 实验现象 将MAX-10小脚丫FPGA和超声波模块HC_SR04插在面包板上&#xff0c;用杜邦线将对应的引脚连接好&#xff0c;烧录程序&#xff0c;小脚丫自带的数码管显示距离数…

全网火爆,性能测试面试常问+测试小技巧总结,要卷就卷成最强的...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试面试常问…

itop-3568开发板驱动学习笔记(26)设备树(五)中断实例分析

《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录 中断控制器配置中断其他属性 中断控制器 设备树中的中断控制器节点和 GPIO 控制器类似&#xff0c;都是由芯片厂家编写&#xff0c;如果是外部中断&#xff0c;中断控制器和 GPIO 控制器是共存的&#xff…