网站首页 > 博客文章 正文
一、 QMouseEvent - 鼠标事件
QMouseEvent 类用来表示一个鼠标事件,当在窗口部件中按下鼠标、释放鼠标和移动鼠标指针时,都会产生鼠标事件 QMouseEvent。利用 QMouseEvent 类可以获知鼠标是哪个键按下释放了、鼠标指针的当前位置等信息。通常是重定义窗口部件的鼠标事件处理函数来进行一些自定义的操作。
- Qt 中的 QMouseEvent 一般只涉及按下鼠标、释放鼠标和移动鼠标指针等操作,而对鼠标滚轮的响应则通过 QWheeEvent 来处理。
- 鼠标移动事件只会在按下鼠标按键的情况下才会发生,除非通过显式调用。
- QWidget::setMouseTracking() 函数来开启鼠标轨迹,这种情况下只要鼠标指针在移动,就会产生一系列的 Qt 鼠标事件。
QMouseEvent 的传递
多个重叠的窗口在实现里好比一个递归的倒立树,鼠标事件会沿着鼠标指针所在的父窗口的链表向上传递,直到某个窗口调用 accept() 函数进行事件处理,否则该事件将被过滤销毁掉。
- 如果想要鼠标指针所在的父窗口不接收该事件,则可以调用函数 ignore() 予以忽略。
- 如果一个鼠标事件传递给鼠标指针所在的窗口,而该窗口的 QT::WA_NoMousePropagation 位置为TRUE,则该事件不会通过父窗口继续向上传递。
- 可以使用 QWidget::setEnabled() 来开启/关闭对应的窗口是否接受键盘和鼠标事件。
鼠标事件实例
鼠标事件使用的时候,加头文件 <QMouseEvent>,然后在头文件中重写这些函数:
#include <QMouseEvent>
protected:
// 鼠标按下事件
void mousePressEvent(QMouseEvent * event);
// 鼠标释放事件
void mouseReleaseEvent(QMouseEvent *event);
// 鼠标移动事件
void mouseMoveEvent(QMouseEvent *event);
然后就是在源文件中去实现具体的逻辑了:
// 鼠标按下事件
void MainWindow::mousePressEvent(QMouseEvent * event)
{
if(event->button() == Qt::LeftButton)
{
qDebug() << "左键按下" ;
}
else if(event->button() == Qt::RightButton)
{
qDebug() << "右键按下" ;
}
// 获取按下时的鼠标指针坐标
qDebug() << event->x() << ":" << event->y();
}
// 鼠标释放事件
void myMouseEvent::mouseReleaseEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
qDebug() << "左键释放" ;
}
else if(event->button() == Qt::RightButton)
{
qDebug() << "右键释放" ;
}
// 获取释放时的鼠标指针坐标
qDebug() << "release:" << event->x() << " " << event->y();
}
// 鼠标移动事件
void myMouseEvent::mouseMoveEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
qDebug() << "左键移动" ;
}
else if(event->button() == Qt::RightButton)
{
qDebug() << "右键移动" ;
}
// 获取移动过程中的鼠标指针坐标
qDebug() << "move:" << event->x() << " " << event->y();
}
输出如下所示:
15:49:08: Starting F:\Project\C++ Project\Qt\build-myMouseEvent-Desktop_Qt_5_9_7_MinGW_32bit-Debug\debug\myMouseEvent...
左键按下
press: 96 75
左键释放
release: 100 98
move: 75 81
move: 76 81
还有一个鼠标双击事件 mouseDoubleClickEvent() ,与鼠标按下事件大同小异,这里就不再详细讲解了。
QMouseEvent 常用成员函数
- globalPos():返回鼠标指针的全局坐标值(类型为 QPoint),即相对于 PC 屏幕的坐标值,而不是相对于当前打开窗口;
- globalX():返回鼠标事件发生时鼠标指针全局坐标的 X 值;
- globalY():返回鼠标事件发生时鼠标指针全局坐标的 Y 值;
- pos():返回鼠标指针和接受该鼠标事件窗口的相对位置,其中的坐标值为整型;
- posF():返回鼠标指针在接受该鼠标事件窗口的相对位置,该坐标值用float类型表示可以增加精确度。
二、QWheelEvent - 滚轮事件
QWheelEvent 类用来表示鼠标滚轮事件,包含用于描述鼠标滑轮事件的相关参数。函数原型:
QWheelEvent::QWheelEvent(const QPoint &pos, int delta, Qt::MouseButtons buttons,Qt::KeyboardModifiers modifiers, Qt::Orientation orient = Qt::Vertical )
功能与参数:
/*** 创建一个wheelEvent对象, ***/
(1)参数pos代表鼠标指针在窗口中的当前位置,通常用globalPos()初始化QCursor::pos(),但并不总是正确的。如果需要显示指定一个全局位置,可以用其他的构造函数;
(2)参数button用于描述在鼠标事件过程中鼠标按键的状态(state);
(3)delta()可以返回滑动的距离,正数值表示滑轮相对于用户在向前滑动,相反,负数值表示滑轮相对于用户是向后滑动的。;
(4)参数modifiers用于描述在鼠标事件中鼠标状态位改变时的参数值(比如鼠标的左中右按键的切换);
(5)参数orient用于指示鼠标滑轮滚动的方向(水平或者垂直)。
示例如下:
// 滚轮事件
void myMouseEvent::wheelEvent(QWheelEvent *event)
{
if(event->delta() > 0) // 当滚轮向上滑,远离使用者
{
ui->textEdit->zoomIn(); // 进行放大,textEdit的光标和字体都放大
}
else // 当滚轮向下滑,靠近使用者
{
ui->textEdit->zoomOut(); // 进行缩小,textEdit的光标和字体都缩小
}
}
用户向上滑动鼠标,则放大;而向下滑动鼠标,则缩小。
猜你喜欢
- 2024-09-29 Qt的6个简单小案例(qt官方例子)
- 2024-09-29 Qt入门阶段之事件(qt入门阶段之事件是什么)
- 2024-09-29 Qt编写安防视频监控系统9-自动隐藏光标
- 2024-09-29 Qt为什么站稳c++GUI的top1(qt quuid)
- 2024-09-29 Qt5 事件(event)机制详解(qt事件是通过什么实现的)
- 2024-09-29 Qt 保持GUI响应的几种方法(qt保存快捷键)
- 2024-09-29 Qt如何模拟鼠标点击?(qt 模拟鼠标点击)
- 2024-09-29 Qt事件的接受与忽略(qt菜单栏按钮点击事件)
- 2024-09-29 「VTK」「DICOM」修改后的VTK sample code
- 2024-09-29 Qt事件(qt事件与信号槽)
你 发表评论:
欢迎- 最近发表
-
- 给3D Slicer添加Python第三方插件库
- Python自动化——pytest常用插件详解
- Pycharm下安装MicroPython Tools插件(ESP32开发板)
- IntelliJ IDEA 2025.1.3 发布(idea 2020)
- IDEA+Continue插件+DeepSeek:开发者效率飙升的「三体组合」!
- Cursor:提升Python开发效率的必备IDE及插件安装指南
- 日本旅行时想借厕所、买香烟怎么办?便利商店里能解决大问题!
- 11天!日本史上最长黄金周来了!旅游万金句总结!
- 北川景子&DAIGO缘定1.11 召开记者会宣布结婚
- PIKO‘PPAP’ 洗脑歌登上美国告示牌
- 标签列表
-
- ifneq (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)