`
gaofen100
  • 浏览: 1243335 次
文章分类
社区版块
存档分类
最新评论

QWheelEvent 使用分析一例

 
阅读更多

缘起

一网友问:

在VS里用Qt新建一个含mainwindow的项目,然后里面添加一个spinbox。除此之外啥都不做。
运行后,鼠标在spinbox内的时候,滚轮有效,移到spinbox外,无效。
在这种情况下,如何使滚轮在spinbox外对其有效?

答案其实很简单,QWheelEvent 的 Manual中如此描述(可是,你真的理解这句话了么?):

Wheel events are sent to the widget under the mouse cursor, but if that widget does not handle the event they are sent to the focus widget. 

一点弯路

说实话,这句话一开始我没有理解。相信大家也是一样,特别是,和它紧挨着还有这样一句话:

A wheel event contains a special accept flag that indicates whether the receiver wants the event. You should call ignore() if you do not handle the wheel event; this ensures that it will be sent to the parent widget.

看起来答案应该很明确,对吧?我们在派生类中override基类的wheelEvent(),然后对事件调用ignore()不就行了??

答案是:不行!!

事件转发?

我们在 Qt事件系统 一文中提到了事件转发,它描述的是这样一种情况:

+------------+
|     C      |
| +-------+  |
| |   B   |  |
| | +--+  |  |
| | |  |  |  |
| | | A|  |  |
| | +--+  |  |
| +-------+  |
+------------+

假定有父子关系的3个Widget:A、B、C(C是顶级窗口)。我们现在在 A 上点击鼠标:

  • 如果A没有接受该事件(ignore),那么事件将转发到B
  • 如果B依然没有接受,将转发到C
  • 即使C不接受,但由于已经是顶级窗口,事件也将停止传递。

所以,我们应该看清楚了:Manual中这个句子描述的是事件转发时的处理。

但前一节的那个句子不是事件转发。二者没有联系!!

WheelEvent

Qt源码学习(从Win32到Qt) 一文中,我们举得就是Wheel Event的例子。它不属于我们前面提到的事件转发行为。

我们重新看看这段代码(它在窗口的回调函数中被调用,将系统的Wheel事件转换成Qt的Wheel事件,而后派发):

  • 首先是定位光标下的widget,将事件发送到该widget中(注意popup widget的处理)
  • 如果该widget不接受(sendSpontaneousEvent返回false)
    • 则查找当前拥有焦点的widget,让事件发送到该焦点widget

看到差别了吧:

要求

事件转发

返回true,但event被ignore

此处

返回false

注意:QWidget::event()的Manual中有些关于事件转发的介绍,请注意查看(此处略)。

如何解决?

答案至此已经很明确了:

  • 在wheelEvent()中,我们只能调用event的accept或ignore,这个只会影响到事件转发
  • 要影响返回值,我们必须override基类的 event() 函数让其返回false才行

一个完整的例子如下:

分享到:
评论

相关推荐

    Qt 标尺绘制Demo C++

    在本文中,我们将深入探讨如何使用Qt5库创建一个自定义的标尺(Slider Ruler)组件。Qt是一个跨平台的C++图形用户界面应用程序开发框架,它提供了丰富的API和工具,使得开发者能够轻松地创建出功能强大的桌面和移动...

    qt 制作的可以左右滑动的导航栏

    本文将深入探讨如何使用Qt来实现这一功能,并且我们将基于提供的`NavigationBarProject`压缩包文件进行讲解。 首先,Qt是一个跨平台的C++图形用户界面应用程序开发框架,它提供了丰富的API和工具,用于构建图形化...

    QT5 加载 SVG格式矢量图

    - 要确保缩放中心是鼠标位置,可以获取`QWheelEvent::pos()`,并将其作为缩放的参考点。 在提供的文件列表中,`svgwindow.cpp`、`svgwidget.cpp`可能包含了加载SVG的逻辑,`mainwindow.cpp`可能处理整个窗口的布局...

    QT2048小游戏

    点击或滑动事件的处理是游戏的关键,这需要实现对应的信号与槽机制,例如定义QTimer来控制动画效果,或者捕获QWheelEvent以实现滑动操作。 游戏逻辑部分,QT2048可能使用二维数组来存储当前的游戏状态,每次操作后...

    font_tr.zip_QT_bestlqn_qt 滚轮缩放_with5mb

    QT框架是一种广泛使用的开源C++库,用于开发跨平台的桌面、移动和嵌入式应用程序。在"font_tr.zip_QT_bestlqn_qt 滚轮缩放_with5mb"这个项目中,主要涉及了QT框架中的图形用户界面(GUI)功能,特别是关于鼠标滚轮...

    Qt for android实现鼠标滚轮事件(放大/缩小)

    在Android平台上开发应用程序时,Qt框架提供了一个强大的跨平台解决方案,允许开发者使用相同的代码库在多个操作系统上构建应用,包括Android。"Qt for android实现鼠标滚轮事件(放大/缩小)"这一主题聚焦于如何在...

    垂直滚轮选择年月日时分钟秒

    "垂直滚轮选择年月日时分钟秒"是一个常见的日期和时间选择功能,广泛应用于各种应用程序和系统,例如表单填写、事件计划或者数据分析等场景。这个功能通常会通过一个自定义控件来实现,以提供用户友好的交互体验。在...

    mouseEvent.rar

    在Qt框架中,鼠标事件是窗口应用程序中非常关键的一部分,它们允许用户与界面进行交互。本文将深入探讨如何处理Qt中的鼠标滚轮事件,以及如何利用这个事件来实现输入文字的放大缩小功能。 Qt库提供了丰富的鼠标事件...

    旋转立方体

    首先,Qt使用QOpenGLWidget或QOpenGLFunctions来支持OpenGL,这是一个用于渲染2D和3D图形的标准API。在"旋转立方体"项目中,我们可能会看到一个继承自QOpenGLWidget的自定义类,它重写了initializeGL()、paintGL()和...

    QT之模仿手机主界面左右滑动翻页,带图片资源

    - 监听水平方向的QWheelEvent或QMouseEvent,捕捉用户的滑动操作,通过修改QStackedWidget的currentIndex实现页面切换。 2. **使用QSwipeView**: - 创建QSwipeView对象,并设置其数据源,可以是一个包含所有页面...

    QT-图片浏览器 练习自用

    实现的功能: ... Ctrl+滚轮放大缩小 反色 亮度和对比度调整 1.QLable加载图片 QListWidget加载缩略图 使用QListWidget获取索引值 切换...3.重写wheelEvent(QWheelEvent *event) 链接Ctrl+滚轮写自己的自定义事件

    QT编写的图片浏览器源代码及发布程序

    QT是一种跨平台的应用程序开发框架,由Trolltech(现为Nokia)开发,它允许开发者使用C++语言创建桌面应用、移动应用以及嵌入式系统应用。本资源是基于QT编写的一个图片浏览器的源代码及发布程序,非常适合初学者...

    Qt 图片缩放,支持滚轮和按键缩放

    可以使用它们的加载函数(如QImage::load()或QPixmap::fromImage())加载图片文件,然后创建一个QGraphicsPixmapItem对象,将其添加到QGraphicsScene中。 9. **布局管理**:如果GUI界面中包含其他控件,如按钮,...

    基于QT的图片浏览处理

    例如,要加载一个BMP文件,可以使用以下代码: ```cpp QImage image("path_to_image.bmp"); if (image.isNull()) { // 处理加载失败的情况 } ``` 接着,实现鼠标滚轮缩放功能。我们可以监听QWheelEvent事件,获取...

    PicShow.zip

    本文将详细讲解如何使用Qt框架来创建一个图片查看器,并实现鼠标滚轮缩放和鼠标移动图片的功能。这个项目以"PicShow.zip"为载体,包含了一个名为"PicShow"的源代码文件,旨在为开发者提供一个具有参考价值的实例。 ...

    嵌入式下滑屏功能日期时间选择组件

    我们将分析该组件的核心特点,以及如何在实际项目中应用和定制。 首先,该组件提供了源代码文件,这意味着开发者可以完全控制并理解其内部工作原理,这对于定制和优化是极为宝贵的。源代码的可用性使得开发者能够...

    VS + Qt 笔记_1.1.docx

    给控件添加相关相应函数时,Qt 信号和槽函数的命名是有规则的,槽函数格式为 on_对象名_信号,以按钮为例,如果对象名为 pushButton,在你在写槽函数的时候按照这种规则,则在头文件中添加:在.cpp 文件下面的构造...

    QT利用realtimechart画波形图

    在"QT利用realtimechart画波形图"这个主题中,我们将深入探讨如何使用QT的QCustomPlot模块,一个强大的2D绘图库,来实现动态显示、交互式操作和保存波形数据。 首先,QCustomPlot是QT中的一个第三方插件,它提供了...

    fantan.zip

    在QT编程中,QTableWidget是一个非常常用的组件,用于展示二维数据表格。"fantan.zip"中的内容可能涉及如何在QTableWidget中实现列表的滑动及回弹效果,这通常是为了提高用户交互体验,特别是在处理大量数据时。在...

    Qt charts动态组件

    通过这些功能,开发者可以创建出直观、交互性强的数据可视化界面,为用户提供更好的理解和分析数据的方式。在实际项目中,还可以根据需求进一步定制图表的样式、颜色、轴标签等,以满足特定的设计要求。

Global site tag (gtag.js) - Google Analytics