8-使用QT5的鼠标事件和滚轮事件

2023-10-27

使用QT5的鼠标事件和滚轮事件

----完成鼠标左键拖动窗口,双击全屏,滚轮放大缩小窗口大小

         这里使用的是QMouseEvent类里面的鼠标事件,通常进行重定义部件的鼠标事件处理函数来实现自定义的内容操作。同样,鼠标滚轮操作是利用QWheelEvent实现滚轮事件。

其中:

voidmousePressEvent(QMouseEvent *event);这个是鼠标按下的时候调用该函数
voidmouseReleaseEvent(QMouseEvent *event);这个是鼠标松开按键的时候调用
voidmouseDoubleClickEvent(QMouseEvent *event);这个是鼠标双击的时候调用
voidmouseMoveEvent(QMouseEvent *event);这个是鼠标按下状态中,移动的时候调用
void wheelEvent(QWheelEvent*event); 这个是鼠标上下滚轮的时候会调用

上述鼠标事件并不完全,但是对于一般我们使用完全足够了。

通过重定义上述函数来实现鼠标、滚轮操作后的自定义的内容处理。

 

现在我们来通过一个具体的程序来看看如何实现的。

首先,新建工程。我们先新建一个QT Gui应用,项目名称我命名为QtEvent,其他的全部默认。

第二步,添加头文件与变量。我们在mainwindows.h里添加头文件:

#include<QMouseEvent>

#include<QWheelEvent>

然后再添加:

protected:
    voidmousePressEvent(QMouseEvent*event);//按下
    voidmouseMoveEvent(QMouseEvent*event);//按下移动
    voidmouseReleaseEvent(QMouseEvent*event);//松开
    voidmouseDoubleClickEvent(QMouseEvent*event);//双击
    voidwheelEvent(QWheelEvent*event);//滚轮
 
private:
    QPointoffset;//储存鼠标指针位置与窗口位置的差值
    QCursorcursor;//创建光标,保存默认光标形状

其中offset是为了窗口拖动的需要的变量,用于存储鼠标指针位置和窗口位置之间的差值,cursor是为了保存默认光标形状,当拖动窗口的时候光标变为手掌,表示进入拖动状态,如果需要自定义光标图标,也可以用QCursor类。

第三步,重定义上述声明的鼠标滚轮函数。

代码如下:

void MainWindow::mousePressEvent(QMouseEvent*event){
    if(event->buttons()==Qt::LeftButton){//如果鼠标按下的是左键
        //则改变鼠标形状为手掌,表示拖动状态。
        QCursorcursor1;//创建光标对象
        cursor1.setShape(Qt::OpenHandCursor);//设置光标形态
        setCursor(cursor1);//使用手掌光标
 
        //这里获取指针位置和窗口位置的差值
        offset=event->globalPos()-this->pos();
 
    }
}
void MainWindow::mouseMoveEvent(QMouseEvent*event){
    if(event->buttons()==Qt::LeftButton){//如果鼠标按下的是左键
        QPointtmp;
        tmp=event->globalPos()-offset;
        move(tmp);
    }
}
 
void MainWindow::mouseReleaseEvent(QMouseEvent*event){
    //拖动完成后,光标恢复默认形状
    setCursor(cursor);
    //或者直接用自带恢复鼠标指针形状的函数为:QApplication::restoreOverrideCursor();
    //但是需要前面设置哪个是默认的光标形状,用这个函数setOverrideCursor()函数
}
 
void MainWindow::mouseDoubleClickEvent(QMouseEvent*event){
     if(event->buttons()==Qt::LeftButton){//如果鼠标按下的是左键
        if(windowState()!=Qt::WindowFullScreen)//如果窗口不是全屏,则让它全屏
            setWindowState(Qt::WindowFullScreen);
        else
            setWindowState(Qt::WindowNoState);//否则恢复以前的大小
 
     }
}
void MainWindow::wheelEvent(QWheelEvent*event){
    QRecttmp=this->geometry();//获取窗口的位置以及大小并保存在tmp中。
    if(event->delta()>0){//如果滚轮往上滚
       tmp.setWidth(tmp.width()+25);//设置宽度为原有基础上+25
       tmp.setHeight(tmp.height()+15);//设置窗口高度为原有基础上+20
       this->setGeometry(tmp);//然后设置窗口大小。
 
    }else{//同样的
       tmp.setWidth(tmp.width()-25);
       tmp.setHeight(tmp.height()-15);
       //如果缩小之后的窗口不小于设置的最小窗口尺寸,则执行缩放。
       if(this->minimumSize().height()<tmp.height()&&this->minimumSize().width()<tmp.width())
           this->setGeometry(tmp);
 
    }
}


第四步,最终执行代码:

 

同样的,如果需要用到键盘监听,步骤跟鼠标监听是一个性质,这里就不再描述。

 

这里需要注意的是:全屏模式是会把标题栏都屏蔽掉的,相当于全屏打游戏的那种全屏,如果只需要实现最大化的功能,那么只需要把WindowFullScreen改为WindowMaximized就可以了。

 

以上代码还可以继续改进:譬如当全屏或者最大化的时候还可以拖动窗口,这显然是不合理的,所以需要进一步在mousePressEvent()mouseMoveEvent()添加判断,如果为全屏/最大化模式,则不允许拖动。

修改代码如下:

……..

…….

…….

if(event->buttons()==Qt::LeftButton&&windowState()!=Qt::WindowMaximized&&windowState()!=Qt:: WindowFullScreen){

         ……..

}

最后就完善了改进。

 

如果你觉得系统自带的标题栏太丑或者不符合口味,你可以根据上面的知识自己屏蔽标题栏,然后实现添加或修改最小化、最大化、关闭按钮的个性化外观,最后完成一个如画如诗意一般的窗口。

 

 

下一篇中我们将要讲如果在一个部件中监听其他多个部件的事件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

8-使用QT5的鼠标事件和滚轮事件 的相关文章

随机推荐

  • 区块链-02-BTC-密码学原理

    目录 区块链与密码学 一 哈希 散列 函数 二 密码散列函数 Cryptographic hash function Collision resistance Hiding digital commitment puzzle friendl
  • 常见分布式系统生成唯一ID的方案

    1 数据库自增长序列或字段 2 UUID 3 UUID的变种 4 Redis生成ID 5 Twitter的snowflake算法 mybatis plus自带策略 6 利用zookeeper生成唯一ID 链接地址 https www cnb
  • 面经:静态多态和动态多态的区别?

    静态多态 Static Polymorphism 和动态多态 Dynamic Polymorphism 是C 中两种不同的多态性形式 1 静态多态 编译时多态 也称为函数重载或模板多态 静态多态是通过函数重载或模板特化来实现的 在编译时确定
  • css动画每日积累

  • c# 获取machineguid_C#正则表达式获取guid(亲测完美解决代码)

    前言 代码亲自测试过 放心使用 完美解决 网上很多文章都没有写清楚 到底是从一段字符串中截取其中的guid 还是判断一段字符串到底是不是guid GUID格式 由三十二位数字和字母组成 8位 4位 4位 4位 12位 c 使用正则表达式从一
  • DL(五)利用softmax线性分类器对线性不可分数据进行分类

    下面为代码 Train a Linear Classifier import numpy as np import matplotlib pyplot as plt np random seed 0 N 100 number of poin
  • Go基础(复杂类型):指针

    Go语言指针 Go 具有指针 指针保存了变量的内存地址 类型 T 是指向类型 T 的值的指针 其零值是 nil var p int 符号会生成一个指向其作用对象的指针 i 42 p i 符号表示指针指向的底层的值 fmt Println p
  • 算法和数据结构的学习之路

    推荐网站 LeetCode 牛客网 Visualgo net 推荐入门书籍 小灰算法 1 入门基础算法知识 2 面试常见算法题
  • python 生成巨大的excel表格xlsxwriter

    原来我是用xlwt来生成excel的 生成的后缀名为xls 但是由于数据太多于是报了个 ValueError row index 65536 not an int in range 65536 错误 原因是 在xlwt中生成的xls文件最多
  • Maven 项目之pom.xml 提示Unknow Error

    今天学习如何搭建SpringCloud 基础项目 pom xml 文件提示Unknow Error 异常 尝试解决办法 我更想maven 项目依赖 检查maven 项目所依赖的jar 包是否正常下载到本地仓库 但都没有解决该问题 经过goo
  • Oracle Data Pump 使用expbp 和 impdp 导出和导入

    预备 创建dmp文件存放文件夹 不创建后面会发生错误 mkdir p opt oracle dmp 1 创建directory数据库对象并授权 sqlplus as sysdba SQL gt create or replace direc
  • Basic Level 1046 划拳 (15分)

    题目 划拳是古老中国酒文化的一个有趣的组成部分 酒桌上两人划拳的方法为 每人口中喊出一个数字 同时用手比划出一个数字 如果谁比划出的数字正好等于两人喊出的数字之和 谁就赢了 输家罚一杯酒 两人同赢或两人同输则继续下一轮 直到唯一的赢家出现
  • 算法推荐技术合规要点梳理与备案指引

    2022年3月1日 国家互联网信息办公室 工业和信息化部 公安部以及国家市场监督管理总局联合发布的 互联网信息服务算法推荐管理规定 以下简称 规定 正式生效 同日 互联网信息服务算法备案系统正式上线运行 下文将简述算法推荐技术合规要点以及备
  • vue3中使用el-table-column sortable对数据进行排序-如何将用户的选择回显到table上显示状态

    element plus 当通过其他设置改变了排序条件后 显示表格需要对应改变筛选状态 在模板中 使用sortable属性将表格列设置为可排序 并绑定一个变量来保存排序的状态
  • 精通python100天——第一天:初识python及环境安装

    课程的初衷 为了小伙伴们 能系统性的从入门到精通python的主要技术点 深入浅出 结合实例 结合实际公司级的项目 让学完这套课程的小伙伴能直接用到工作中去 或达到求职的水平 Python简介 Python是由荷兰人吉多 范罗苏姆 Guid
  • 基于Java语言构建区块链(二)—— 工作量证明

    最终内容请以原文为准 https wangwei one posts 7890ab7e html 引言 上一篇文章中 我们实现了区块链最基本的数据结构模型 添加区块以及和前一个区块连接在一起 但是 我们的实现方式非常简单 而真实的比特币区块
  • 小程序性能优化之页面预加载方案——让你的小程序运行如飞 集成篇

    小程序性能优化之页面预加载方案 集成篇 转载请注明出处 https blog csdn net sinat 27612147 article details 80802725 前言 之前看到一篇文章 微信小程序之提高应用速度小技巧 是讲如何
  • Python基础复习总结

    文章目录 Python基础复习 Python的下载与安装 标识符 关键字 模块 条件 循环语句 if elif else for循环 while循环 成员测试 Python中的数据类型 序列 列表 list 元组 tuple 集合 set
  • javascript数据类型number、string和布尔

    number数字类型 计算机number是有一个范围的 2的53次方 2的53次方 注意书写顺序 例如一个商品17 45 买3个打9折 以下两种写法保留两位小数结果是不相同的 var obj age 20 var num 17 45 con
  • 8-使用QT5的鼠标事件和滚轮事件

    使用QT5的鼠标事件和滚轮事件 完成鼠标左键拖动窗口 双击全屏 滚轮放大缩小窗口大小 这里使用的是QMouseEvent类里面的鼠标事件 通常进行重定义部件的鼠标事件处理函数来实现自定义的内容操作 同样 鼠标滚轮操作是利用QWheelEve