QT交互事件

常用的用户与应用程序之间的交互事件有鼠标事件、键盘事件、屏幕触摸事件等等,在QT中这些事件的基类是QInputEvent,其中最重要的四个个事件是QMouseEvent、QWheelEvent、QKeyEvent和QHoverEvent。

QMouseEvent

  • 鼠标事件发生在小部件内按下或释放鼠标按钮时,或者当鼠标光标移动时。
  • 除非QWidget::setMouseTracking()启用了鼠标跟踪,否则鼠标移动事件只会在按下鼠标按钮时发生。
  • 当鼠标按钮在小部件内被按下时,Qt自动抓取鼠标,小部件将继续接收鼠标事件,直到最后一个鼠标按钮被释放。
  • 鼠标事件包含一个特殊的accept标志,该标志指示接收者是否需要该事件,如果小部件不能处理鼠标事件,应该调用ignore()。
  • 鼠标事件在父部件链上传播,直到有部件使用accept()接受它,或者事件过滤器使用它。
  • 如果将鼠标事件传播到已经设置了Qt::WA_NoMousePropagation的部件上,则该鼠标事件将不会再向上传播到父部件链。
  • 通过调用继承自QInputEvent的modifiers()函数,可以找到键盘修饰词键的状态。
  • pos()、x()和y()函数给出了相对于接收鼠标事件的小部件的光标位置;如果您因为鼠标事件而移动小部件,请使用globalPos()返回的全局位置来避免震动。
  • setEnabled()函数可用于启用或禁用小部件的鼠标和键盘事件。
  • 鼠标事件的事件处理器有:QWidget::mousePressEvent()、QWidget::mouseReleaseEvent()、QWidget::mouseDoubleClickEvent()和QWidget::mouseMoveEvent()。

void QWidget::mousePressEvent(QMouseEvent *event)

  • 这个事件处理器可以在子类中重新实现,以接收小部件的鼠标按下事件。
  • 默认实现在单击窗口外时关闭弹出窗口小部件,对于其他小部件类型,它什么也不做。

void QWidget::mouseReleaseEvent(QMouseEvent *event)

  • 这个事件处理器可以在子类中重新实现,以接收小部件的鼠标释放事件。

void QWidget::mouseDoubleClickEvent(QMouseEvent *event)

  • 这个事件处理器可以在子类中重新实现,以接收小部件的鼠标双击事件。
  • 默认实现调用mousePressEvent()。
  • 注意除了双击事件外,小部件还将接收鼠标按下和鼠标释放事件,开发人员负责确保应用程序正确地解释这些事件。

void QWidget::mouseMoveEvent(QMouseEvent *event)

  • 这个事件处理器可以在子类中重新实现,以接收小部件的鼠标移动事件。
  • 如果关闭鼠标跟踪,鼠标移动事件仅在鼠标移动时按下鼠标按钮时发生;如果打开鼠标跟踪,即使没有按下鼠标按钮,也会发生鼠标移动事件。
  • pos()报告鼠标光标相对于这个小部件的位置。对于鼠标按下和释放事件,位置通常与最后一个鼠标移动事件的位置相同,但是如果用户的手在抖动,位置可能不同。这是底层窗口系统的一个特性,而不是Qt。
  • 如果希望在鼠标移动时立即显示工具提示(例如使用QMouseEvent::pos()获取鼠标坐标并将其显示为工具提示),必须首先启用上面描述的鼠标跟踪,然后为了确保工具提示被立即更新,必须在mouseMoveEvent()的实现中调用QToolTip::showText()而不是setToolTip()。

QWheelEvent

  • 滚轮事件被发送到鼠标指针下的小部件,但是如果小部件不处理事件,它们将被发送到焦点小部件。
  • 滚轮事件是为鼠标滚轮和触摸板滚动手势生成的。
  • 有两种方法可以读取滚轮事件的delta:angleDelta()返回以滚轮角度为单位的delta,这个值总是被提供;pixelDelta()返回以屏幕像素为单位的delta,并可用于具有高分辨率触控板的平台,如OS x,如果是这样的话,source()将返回Qt::MouseEventSynthesizedBySystem。
  • 函数pos()和globalPos()返回事件发生时鼠标指针的位置。
  • 滚轮事件包含一个特殊的accept标志,该标志指示接收者是否需要该事件。如果不处理滚轮事件,应该调用ignore(),这将确保它被发送到父部件。
  • setEnabled()函数可用于启用或禁用小部件的鼠标和键盘事件。
  • 事件处理器QWidget::wheelEvent()用来处理滚轮事件。

void QWidget::wheelEvent(QMouseEvent *event)

  • 这个事件处理器可以在子类中重新实现,以接收小部件的滚轮事件。
  • 对于重新实现这个处理程序,如果不处理它,那么ignore()事件是非常重要的,以便小部件的父部件能够解释它。
  • 默认实现将忽略该事件。

QKeyEvent

  • 当按下或释放按键时,按键事件将与键盘输入焦点一起发送到小部件。
  • 按键事件包含一个特殊的accept标志,该标志指示接收者是否将处理按键事件。这个标志是默认为QEvent::KeyPress和QEvent::KeyRelease设置的,所以在操作一个按键事件时不需要调用accept()。对于QEvent::ShortcutOverride,接收者需要显式接受事件来触发覆盖。在按键事件上调用ignore()会将把它传播到父部件,事件在父部件链上传播,直到小部件接受它或事件过滤器使用它。
  • QWidget::setEnable()为小部件启用或禁用鼠标和键盘事件。
  • 按键事件的事件处理器有:QWidget::keyPressEvent()、 QWidget::keyReleaseEvent()、 QGraphicsItem::keyPressEvent()和QGraphicsItem::keyReleaseEvent()。

void QWidget::keyPressEvent(QKeyEvent *event)

  • 这个事件处理器可以在子类中重新实现,以接收小部件的按键按下事件。
  • 小部件最初必须调用setFocusPolicy()来接受焦点,并拥有焦点才能接收按键事件。
  • 如果重新实现了这个处理程序并且也不需要这个按键表现出什么行为,那么调用基类实现是非常重要的。
  • 如果用户按下QKeySequence::Cancel(通常是Escape键)的键序列,默认实现将关闭弹出窗口小部件。其他按键默认忽略该事件,以便小部件的父部件可以解释它。
  • 注意QKeyEvent是以isAccepted() == true开始,所以用户不需要调用QKeyEvent::accept()——如果对这个按键进行操作,就不要调用基类实现。

void QWidget::keyReleaseEvent(QKeyEvent *event)

  • 这个事件处理器可以在子类中重新实现,以接收小部件的按键释放事件。
  • 小部件最初必须接受焦点,并拥有焦点才能接收按键释放事件。
  • 如果重新实现了这个处理程序并且也不需要这个按键表现出什么行为,那么调用基类实现是非常重要的。
  • 默认实现将忽略该事件,以便小部件的父部件能够解释它。
  • 注意QKeyEvent是以isAccepted() == true开始,所以用户不需要调用QKeyEvent::accept()——如果对这个按键进行操作,就不要调用基类实现。

void QGraphicsItem::keyPressEvent(QKeyEvent *event)

  • 这个事件处理器可以在子类中重新实现,以接收图形项的按键按下事件。
  • 默认实现将忽略该事件,如果重新实现此处理程序,则默认接受该事件。
  • 注意,只有设置了itemisfocable标志且具有键盘输入焦点的图形项才能接受到按键按下事件。

void QGraphicsItem::keyReleaseEvent(QKeyEvent *event)

  • 这个事件处理器可以在子类中重新实现,以接收图形项的按键释放事件。
  • 默认实现将忽略该事件,如果重新实现此处理程序,则默认接受该事件。
  • 注意,只有设置了itemisfocable标志且具有键盘输入焦点的图形项才能接受到按键按下事件。

QHoverEvent

  • 鼠标事件发生在鼠标光标被移动到、移出或移动到小部件内,并且小部件具有Qt::WA_Hover属性的情况下。
  • 函数pos()给出当前的光标位置,而oldPos()给出旧的光标位置。
  • 事件QEvent::HoverEnter和QEvent::HoverLeave与事件QEvent::Enter和QEvent::Leave之间有一些相似之处。但是它们略有不同,因为我们在HoverEnter和HoverLeave的事件处理器中执行了update()。
  • QEvent::HoverMove与QEvent::MouseMove也略有不同。
  • 举例,一个顶层窗口a包含一个子窗口B,它又包含一个子窗口C(都启用了鼠标跟踪):
  •  

  • 现在,如果将光标从A中间的顶部移动到底部,将得到以下QEvent::MouseMove事件:A:MouseMove、B: MouseMove、C: MouseMove。对于QEvent::HoverMove也会获得相同的事件,只是该事件始终传播到顶级,而不管该事件是否被接受。它只会在设置了Qt::WA_NoMousePropagation属性时才会停止传播,在这种情况下,事件将以以下方式发生:
  1. A::HoverMove
  2. A::HoverMove,B::HoverMove
  3. A::HoverMove,B::HoverMove,C::HoverMove
  • QEvent::HoverEnter和QEvent::HoverLeave一般存在于QHoverEvent事件,而QEvent::Enter一般属于QEnterEvent。
  • QWidget没有为QHoverEvent提供事件处理器,对于这个事件它的处理只是调用update()函数:
  
bool QWidget::event(QEvent *event)
{
  switch (event->type()) {
      ......
      case QEvent::HoverEnter:
      case QEvent::HoverLeave:
           update();
           break;
      ......
   }
   return true;
}
  • 对于QGraphicsView及它的父类QAbstractScrollArea和QFrame中的event()都没有重新实现对该事件的处理,直接使用的QWidget的处理方法。
  • QGraphicsItem对悬停事件有专门的事件处理器,不过是对QGraphicsSceneHoverEvent事件,这个事件是在QGraphicsScene中产生的,QGraphicsItem有三个处理器:hoverEnterEvent、hoverLeaveEvent和hoverMoveEvent。

其他事件处理器

void QWidget::dragEnterEvent(QDragEnterEvent *event)

  • 当拖动正在进行并且鼠标进入此小部件时,将调用此事件处理器。
  • 如果忽略该事件,小部件将不会接收任何拖动移动事件。
  • 有关如何在应用程序中提供拖放功能的概述,请参阅拖放文档。

void QWidget::dragLeaveEvent(QDragLeaveEvent *event)

  • 当拖动正在进行并且鼠标离开此小部件时,将调用此事件处理器。
  • 有关如何在应用程序中提供拖放功能的概述,请参阅拖放文档。

void QWidget::dragMoveEvent(QDragMoveEvent *event)

  • 如果拖动正在进行中,并且出现下列情况之一时,将调用此事件处理器:光标进入此小部件并且在此小部件中移动,或者当此小部件具有焦点时按下键盘上的修改键。
  • 有关如何在应用程序中提供拖放功能的概述,请参阅拖放文档。

void QWidget::dropEvent(QDropEvent *event)

  •  当拖动在这个部件上释放时,将调用此事件处理器。
  • 有关如何在应用程序中提供拖放功能的概述,请参阅拖放文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值