QWidget事件处理 之 鼠标事件

目录

鼠标事件QMouseEvent的详细描述

QMouseEvent函数原型:

QMouseEvent Class相关:

mousePressEvent 鼠标按下事件

mouseMoveEvent 鼠标移动事件

mouseReleaseEvent  鼠标释放事件

QWheelEvent  鼠标滚轮事件

鼠标移入移出事件

后记,待整理:


QMouseEvent类用来表示一个鼠标事件,在窗口部件中按下鼠标或者移动鼠标光标时,都会产生鼠标事件。利用QMouseEvent类可以获知鼠标是哪个键按下了,鼠标指针的当前位置等信息。通常是重定义部件的鼠标事件处理函数来进行一些自定义的操作。QWheelEvent类用来表示鼠标滚轮事件,主要用来获取滚轮移动的方向和距离。

默认情况下,只有在按下鼠标按钮(不释放)时移动鼠标,才会产生鼠标移动事件,否则不会产生鼠标移动事件。除非使用QWidget::setMouseTracking()主动去开启鼠标跟踪,这时才会实时产生鼠标移动事件。

当在窗口部件内按下鼠标按钮时,Qt将自动抓取鼠标。窗口部件将持续接收鼠标事件,直到释放鼠标按钮。

鼠标事件包含一个特殊的接收标志,指示接收者是否需要该事件。如果不想鼠标事件被窗口部件处理,你应该调用ignore()。此时鼠标事件将在父窗口部件向上传播,直到窗口部件使用accept()接收鼠标事件,或者过滤掉鼠标事件。(注意:如果将鼠标事件传播到已为其设置 Qt::WA_NoMousePropagation的组件时,则该鼠标事件将不会在上一级组件中进一步传播)

鼠标事件QMouseEvent的详细描述

  • 在小部件内按下或释放鼠标按钮或移动鼠标光标时,会发生鼠标事件。
  • 只有在按下鼠标按钮时才会发生鼠标移动事件,除非使用QWidget::setMouseTracking()启用了鼠标跟踪。
  • 当在小部件内按下鼠标按钮时,Qt自动抓取鼠标;小部件将继续接收鼠标事件,直到释放最后一个鼠标按钮。
  • 注意:Qt中的QMouseEvent一般只涉及鼠标左键或右键的单击、释放等操作,而对鼠标滚轮的响应则通过QWheeEvent来处理。
  • 鼠标事件包含一个特殊的接受标志flag,指示接收者是否需要该事件。如果小部件未处理鼠标事件,则应调用ignore()。鼠标事件沿父窗口小部件链向上传播,直到窗口小部件使用accept()接受鼠标事件,或者事件筛选器使用鼠标事件。
  • 注意:如果将鼠标事件传播到为其设置了Qt::WA_NoMousePropagation的小部件,则该鼠标事件将不会进一步传播到父小部件链的上游。
  • 通过调用从QInputEvent继承的modifiers()函数,可以找到键盘键值的状态。
  • 函数pos()、x()和y()给出光标相对于接收鼠标事件的小部件的位置。如果由于鼠标事件而移动小部件,请使用globalPos()返回的全局位置来避免抖动。
  • QWidget::setEnabled()函数可用于启用或禁用小部件的鼠标和键盘事件。
  • 需要对鼠标事件进行处理时,通常要重新实现以下几个鼠标事件处理函数:
QWidget::mousePressEvent(QMouseEvent* event) //鼠标按压事件
QWidget::mouseReleaseEvent(QMouseEvent* event) //鼠标释放
QWidget::mouseDoubleClickEvent(QMouseEvent* event) //鼠标双击事件
QWidget::mouseMoveEvent(QMouseEvent* event) //鼠标移动事件,注意是在哪个区域移动

//下面换个写法,依旧是QWidget类的鼠标事件函数,但是我写成声明的形式:

void resizeEvent(QResizeEvent* event); //窗口大小改变
void paintEvent(QPaintEvent* event); //窗口绘制
void closeEvent(QCloseEvent* event); //窗口关闭 

全都返回void

QMouseEvent函数原型:

构造鼠标事件对象。

QMouseEvent::QMouseEvent(QEvent::Type type, const QPointF &localPos, const QPointF &windowPos, const QPointF &screenPos, Qt::MouseButton button, Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers, Qt::MouseEventSource source)

其中:

  • 类型参数必须是 QEvent::MouseButtonPress、QEvent::MouseButtonRelease、QEvent::MouseButtonDblClick 或 QEvent::MouseMove。
  • localPos、windowPos 和 screenPos 点分别指定鼠标光标相对于接收小部件或项目、窗口和屏幕的位置。
  • 导致事件的按钮作为 Qt::MouseButton 枚举中的值提供。如果事件类型为MouseMove,则此事件的相应按钮为Qt::NoButton。
  • 按钮是事件发生时所有按钮的状态,修饰符是所有键盘修饰符的状态。
  • 事件的源由源指定。
  • Qt::MouseButton QMouseEvent::button() const
    返回导致事件的按钮。  请注意,对于鼠标移动事件,返回的值始终为Qt::NoButton。
  • Qt::MouseButtons QMouseEvent::buttons() const

    返回生成事件时的按钮状态。按钮状态是使用OR运算符的Qt::LeftButton、Qt::RightButton、Qt::MidButton的组合。对于鼠标移动事件,这是所有按下的按钮。对于鼠标按下和双击事件,这包括导致事件的按钮。对于鼠标释放事件,这不包括导致事件的按钮。

QMouseEvent Class相关:

 Header :    #include<QMouseEvent>
 qmake :     QT += gui
 inherits :  QInputEvent

mousePressEvent 鼠标按下事件

函数原型:

[virtual protected] void QWidget::mousePressEvent(QMouseEvent *event)

可以在子类中 重新实现 该事件处理程序,以接收小部件的鼠标按下事件。示例:

void Widget::mousePressEvent(QMouseEvent *event)
{
	//如果鼠标左键按下
    if (event->button() == Qt::LeftButton) {
    	//获取鼠标在事件接收者中的位置pos
        lastPoint = event->pos();
    }
	// 如果是鼠标右键按下
	else if(event->button() == Qt::RightButton)
	{
	   //···
	}  
}

mouseMoveEvent 鼠标移动事件

[virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event)

可以在子类中重新实现这个事件处理程序,以接收小部件的鼠标移动事件。如果关闭鼠标跟踪,则只有在移动鼠标时按下鼠标按钮,才会发生鼠标移动事件。

如果打开鼠标跟踪 setMouseTracking(true);  ,即使未按下鼠标按钮,也会发生鼠标移动事件。

每当您移动小部件以响应鼠标事件时,globalPos()  可能与当前指针位置 QCursor::pos()QWidget::mapToGlobal( pos() )  有很大不同。


示例:

void ScribbleArea::mouseMoveEvent(QMouseEvent *event)
{
	// 这里必须使用buttons()  因为是鼠标移动
    if ((event->buttons() & Qt::LeftButton) && scribbling)
    {
    	//···
    }
}

mouseReleaseEvent  鼠标释放事件

[virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event)

可以在子类中重新实现这个事件处理程序,以接收小部件的鼠标释放事件。
示例:

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
   if (event->button() == Qt::LeftButton) {
          lastPoint = event->pos();
      }
}

QWheelEvent  鼠标滚轮事件

void Widget::wheelEvent(QWheelEvent *event)
{  
    if(event->delta() > 0)// 当滚轮远离使用者时
    {
        ···
    }
    else//当滚轮向使用者方向旋转时
    {
        ···
    }
}

鼠标移入移出事件

  • [virtual protected]  void QWidget::enterEvent( QEvent *event )
  • [virtual protected]  void QWidget::leaveEvent( QEvent *event )

此事件处理程序可以在子类中重新实现,以接收在事件参数中传递的小部件进入或离开事件。示例:

void Widget::enterEvent(QEvent *)
{
    qDebug()<<"鼠标移入";
}
void Widget::leaveEvent(QEvent *)
{
   qDebug()<<"鼠标移出";
}

后记,待整理:

Qt鼠标事件_qt 鼠标事件-CSDN博客

Qt鼠标事件全面解析:从基础到实战-CSDN博客

  • 24
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懒回顾,半缘君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值