当前位置:网站首页>Qt | 鼠标事件和滚轮事件 QMouseEvent、QWheelEvent
Qt | 鼠标事件和滚轮事件 QMouseEvent、QWheelEvent
2022-08-02 14:41:00 【华为云】
前言:
程序中经常用到鼠标事件,根据不同的鼠标事件实现不同的功能。在 Qt 中,QMouseEvent 类表示鼠标事件。通常通过重定义部件的鼠标事件处理函数的方式来进行一些自定义的操作。QWheelEvent 类来表示鼠标滚轮事件,主要用来获取滚轮滚动的方向和距离。
鼠标事件:
我们通常使用的鼠标事件有:
void mousePressEvent(QMouseEvent *event); //鼠标按键按下
void mouseReleaseEvent(QMouseEvent *event); //鼠标按键抬起
void mouseDoubleClickedEvent(QMouseEvent *event); //鼠标按键双击
void mouseMouveEvent(QMouseEvent *event); //鼠标移动
void wheelEvent(QWheelEvent *event); //鼠标滚轮滚动
在 QWidget 中的定义如图:
鼠标移动事件:
鼠标的移动事件 mouseMouveEvent()默认是在鼠标按键按下时移动鼠标的时候才会产生;
如果不想按下鼠标也可以获取到鼠标移动事件的话,就需要在构造函数中添加:
setMouseTracking(true);//设置鼠标跟踪
设置鼠标形状:
1.设置鼠标为系统提供的形状:
QCursor cursor;
cursor.setShape(Qt::OpenHandCursor);//小手掌形状
setCursor(cursor);
//或者使用:QApplication::setOverriedCursor(cursor);//使鼠标指针暂时改变形状
Qt 中提供了常用的鼠标指针的形状,可以在帮助中通过 Qt::CursorShape 关键字查看。
2.设置鼠标为自定义形状:
QCursor cursor("./image/logo.png");
setCursor(cursor);
//或者使用:QApplication::setOverrideCursor(cursor);//使鼠标指针暂时改变形状
如果使用了 QApplication::setOverriedCursor(cursor);来暂时改变鼠标指针的形状,那么就需要在恢复鼠标形状时使用 QApplication::restoreOverrideCursor();
Q_UNUSED():
如果在函数中没有用到函数传进来的参数的话,比如说在 void mousePressEvent(QMouseEvent *event)函数体中,我们没有使用到 event 这个参数,这样在编译程序的时候会出现警告,但是这不会影响程序的编译运行,如果不想出现这样的警告信息,就可以在函数内第一句加上 Q_UNUSED(xxx);xxx 表示不使用的参数。这样就不会出现警告了。
滚轮事件:
QWheelEvent()类的 delta()函数返回了滚轮移动的距离。
每当滚轮转动一下,默认是 15 度,这时调用 QWheelEvent()::delta()返回的值就是 15*8=120。
转动方向为向外,返回正值;转动方向为向内,返回负值。所以可以通过这个函数的返回值的正负来判断滚轮的方向。
实现鼠标拖动窗口移动:
void Widget::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton) // 鼠标左键
{
m_isMouseLeftDown = true;
m_dragPos = event->globalPos() - pos(); //获取指针位置和窗口位置的差值
}
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons() & Qt::LeftButton)//见注:
{
move(event->globalPos() - m_dragPos);
event->accept(); //事件处理函数“接收”了这个事件,不要再向父部件传递;
}
}
注:
因为鼠标移动时会检测所有按下的按键,而这时使用 QMouseEvent 的 button()函数无法获取是哪个按键按下,只能使用 buttons()函数,所以要用 buttons()和 Qt::LeftButton 进行按位与运算来判断是否是鼠标左键按下。
实现滚轮放大或缩小编辑器中的内容:
void Widget::wheelEvent(QWheelEvent *event)
{
if(event->delta() > 0)
{
ui->textEdit->zoomIn();//放大
}
else
{
ui->textEdit->zoomOut();//缩小
}
}
边栏推荐
猜你喜欢
第五章-5.2-指示器随机变量
【 Leetcode string, the string transform/hexadecimal conversion 】 HJ1. The length of the string last word HJ2. Calculation of a certain number of characters appear HJ30. String merging processing
ELK日志分析系统
初入c语言
Based on mobileNet dog breed classification (migration)
浅析PM2实用入门指南
Window function method for FIR filter design
Apache APISIX 2.15 版本发布,为插件增加更多灵活性
XGBoost 和随机森林在表格数据上优于深度学习?
阿里云上安装MQTT服务器
随机推荐
公司最大的内卷,是“管理错位”
Redis最新6.27安装配置笔记及安装和常用命令快速上手复习指南
2022-7-15 第五组 瞒春 学习笔记
基于ip的证书
PAT甲级 1137 期终成绩
PAT Class A 1145 Hash - Average Lookup Time
MySQL 视图(详解)
【学习笔记之菜Dog学C】自定义类型详解(结构体+枚举+联合)
PAT甲级 1143 最低公共祖先
看我如何用多线程,帮助运营小姐姐解决数据校对系统变慢!
2022-07-11 第五小组 瞒春 学习笔记
XGBoost 和随机森林在表格数据上优于深度学习?
2022-07-27 第六小组 瞒春 学习笔记
CNN鲜花分类
Getting Started with MySQL Syntax
2022年安全员-A证考试试题及模拟考试
【Untitled】
es6 循环,并终止循环
两分钟录音就可秒变语言通!火山语音音色复刻技术如何修炼而成?
【无标题】