Qt | 鼠标事件和滚轮事件 QMouseEvent、QWheelEvent

简介: 学习使用Qt的鼠标事件和滚轮事件。

前言:

程序中经常用到鼠标事件,根据不同的鼠标事件实现不同的功能。在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();//缩小
    }
}


目录
相关文章
|
7月前
|
存储 开发框架 开发者
QT C++焦点事件:多角度解析实用技巧与方法
QT C++焦点事件:多角度解析实用技巧与方法
1407 0
|
7月前
|
存储 搜索推荐 人机交互
Qt鼠标事件全面解析:从基础到实战
Qt鼠标事件全面解析:从基础到实战
1350 0
|
7月前
|
API
QT基础入门——Qt事件(五)
QT基础入门——Qt事件(五)
435 0
QT基础入门——Qt事件(五)
|
2月前
|
存储 Windows
(13) Qt事件系统(two)
文章详细介绍了Qt事件系统,包括事件分发、自定义事件、事件传播机制、事件过滤以及事件与信号的区别。
106 3
(13) Qt事件系统(two)
|
2月前
|
编解码 程序员
(12)Qt事件系统(one)
本文详细介绍了Qt事件系统,包括各种系统事件、鼠标事件、键盘事件、定时器等的处理方法和示例代码。
94 0
(12)Qt事件系统(one)
|
4月前
|
开发者
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
237 4
|
6月前
Qt鼠标事件
Qt鼠标事件
|
6月前
Qt事件分发器、事件过滤器
Qt事件分发器、事件过滤器
|
5月前
|
开发者
Qt中的事件该如何学习?(附带案例)
事件是Qt中比较重要的一部分,在初期如果理解不当学习可能会比较困难,这里提一嘴当初教我的那位老师水平是真的高,让我很轻易的就理解了事件的概念。 在平时我们见到那些界面上的某些快捷键就有可能是事件做的,例如ESC关闭窗口,Enter提交或者登录这种类似的,这也是事件的强大之处。
133 0
|
7月前
|
开发框架 算法 程序员
【Qt 元对象系统】深入探索Qt事件过滤:从基础到高级应用
【Qt 元对象系统】深入探索Qt事件过滤:从基础到高级应用
215 7