缘起
一网友问:
在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才行
一个完整的例子如下:
分享到:
相关推荐
在本文中,我们将深入探讨如何使用Qt5库创建一个自定义的标尺(Slider Ruler)组件。Qt是一个跨平台的C++图形用户界面应用程序开发框架,它提供了丰富的API和工具,使得开发者能够轻松地创建出功能强大的桌面和移动...
本文将深入探讨如何使用Qt来实现这一功能,并且我们将基于提供的`NavigationBarProject`压缩包文件进行讲解。 首先,Qt是一个跨平台的C++图形用户界面应用程序开发框架,它提供了丰富的API和工具,用于构建图形化...
- 要确保缩放中心是鼠标位置,可以获取`QWheelEvent::pos()`,并将其作为缩放的参考点。 在提供的文件列表中,`svgwindow.cpp`、`svgwidget.cpp`可能包含了加载SVG的逻辑,`mainwindow.cpp`可能处理整个窗口的布局...
点击或滑动事件的处理是游戏的关键,这需要实现对应的信号与槽机制,例如定义QTimer来控制动画效果,或者捕获QWheelEvent以实现滑动操作。 游戏逻辑部分,QT2048可能使用二维数组来存储当前的游戏状态,每次操作后...
QT框架是一种广泛使用的开源C++库,用于开发跨平台的桌面、移动和嵌入式应用程序。在"font_tr.zip_QT_bestlqn_qt 滚轮缩放_with5mb"这个项目中,主要涉及了QT框架中的图形用户界面(GUI)功能,特别是关于鼠标滚轮...
在Android平台上开发应用程序时,Qt框架提供了一个强大的跨平台解决方案,允许开发者使用相同的代码库在多个操作系统上构建应用,包括Android。"Qt for android实现鼠标滚轮事件(放大/缩小)"这一主题聚焦于如何在...
"垂直滚轮选择年月日时分钟秒"是一个常见的日期和时间选择功能,广泛应用于各种应用程序和系统,例如表单填写、事件计划或者数据分析等场景。这个功能通常会通过一个自定义控件来实现,以提供用户友好的交互体验。在...
在Qt框架中,鼠标事件是窗口应用程序中非常关键的一部分,它们允许用户与界面进行交互。本文将深入探讨如何处理Qt中的鼠标滚轮事件,以及如何利用这个事件来实现输入文字的放大缩小功能。 Qt库提供了丰富的鼠标事件...
首先,Qt使用QOpenGLWidget或QOpenGLFunctions来支持OpenGL,这是一个用于渲染2D和3D图形的标准API。在"旋转立方体"项目中,我们可能会看到一个继承自QOpenGLWidget的自定义类,它重写了initializeGL()、paintGL()和...
- 监听水平方向的QWheelEvent或QMouseEvent,捕捉用户的滑动操作,通过修改QStackedWidget的currentIndex实现页面切换。 2. **使用QSwipeView**: - 创建QSwipeView对象,并设置其数据源,可以是一个包含所有页面...
实现的功能: ... Ctrl+滚轮放大缩小 反色 亮度和对比度调整 1.QLable加载图片 QListWidget加载缩略图 使用QListWidget获取索引值 切换...3.重写wheelEvent(QWheelEvent *event) 链接Ctrl+滚轮写自己的自定义事件
QT是一种跨平台的应用程序开发框架,由Trolltech(现为Nokia)开发,它允许开发者使用C++语言创建桌面应用、移动应用以及嵌入式系统应用。本资源是基于QT编写的一个图片浏览器的源代码及发布程序,非常适合初学者...
可以使用它们的加载函数(如QImage::load()或QPixmap::fromImage())加载图片文件,然后创建一个QGraphicsPixmapItem对象,将其添加到QGraphicsScene中。 9. **布局管理**:如果GUI界面中包含其他控件,如按钮,...
例如,要加载一个BMP文件,可以使用以下代码: ```cpp QImage image("path_to_image.bmp"); if (image.isNull()) { // 处理加载失败的情况 } ``` 接着,实现鼠标滚轮缩放功能。我们可以监听QWheelEvent事件,获取...
本文将详细讲解如何使用Qt框架来创建一个图片查看器,并实现鼠标滚轮缩放和鼠标移动图片的功能。这个项目以"PicShow.zip"为载体,包含了一个名为"PicShow"的源代码文件,旨在为开发者提供一个具有参考价值的实例。 ...
我们将分析该组件的核心特点,以及如何在实际项目中应用和定制。 首先,该组件提供了源代码文件,这意味着开发者可以完全控制并理解其内部工作原理,这对于定制和优化是极为宝贵的。源代码的可用性使得开发者能够...
给控件添加相关相应函数时,Qt 信号和槽函数的命名是有规则的,槽函数格式为 on_对象名_信号,以按钮为例,如果对象名为 pushButton,在你在写槽函数的时候按照这种规则,则在头文件中添加:在.cpp 文件下面的构造...
在"QT利用realtimechart画波形图"这个主题中,我们将深入探讨如何使用QT的QCustomPlot模块,一个强大的2D绘图库,来实现动态显示、交互式操作和保存波形数据。 首先,QCustomPlot是QT中的一个第三方插件,它提供了...
在QT编程中,QTableWidget是一个非常常用的组件,用于展示二维数据表格。"fantan.zip"中的内容可能涉及如何在QTableWidget中实现列表的滑动及回弹效果,这通常是为了提高用户交互体验,特别是在处理大量数据时。在...
通过这些功能,开发者可以创建出直观、交互性强的数据可视化界面,为用户提供更好的理解和分析数据的方式。在实际项目中,还可以根据需求进一步定制图表的样式、颜色、轴标签等,以满足特定的设计要求。