Qt 鼠标滚轮响应问题

wsrlyk 2011-04-27 05:19:34
资源管理器、Visual Studio等软件(目前发现好像大部分软件都是),在具有焦点时,即使把鼠标移到焦点所在区域外面(如任务栏等),也能响应鼠标滚轮。
IE、ChromePlus等软件,必须把鼠标移到页面上,滚动滚轮时才会响应。移到别的地方就不行了
有道词典……它的索引栏属于第一种情况,索引栏右边的具体解释栏就属于第二种情况……

于是我想问第一种情况是怎么实现的……

我目前用Qt做界面,用的VisualStudio……啥都不做似乎是第二种情况
...全文
1298 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wsrlyk 2011-05-01
  • 打赏
  • 举报
回复
Thx 诸位,尤其是dbzhang800 :)
wsrlyk 2011-05-01
  • 打赏
  • 举报
回复
Soga…………
[Quote=引用 11 楼 dbzhang800 的回复:]

引用 10 楼 wsrlyk 的回复:

good,对于单个spinbox的问题可以解决。
不过感觉对于两个spinbox,或者说资源管理器那种问题不太好搞定啊。因为资源管理器左右列表都会处理wheelEvent,所以第一时间就接受事件了


如果你是这样的要求的话,我们就不用考虑前面提到那种wheel特有的方法了,整个事情应该更简单了。你只需要给你的QApplication添加一个……
[/Quote]
dbzhang800 2011-05-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wsrlyk 的回复:]

good,对于单个spinbox的问题可以解决。
不过感觉对于两个spinbox,或者说资源管理器那种问题不太好搞定啊。因为资源管理器左右列表都会处理wheelEvent,所以第一时间就接受事件了
[/Quote]

如果你是这样的要求的话,我们就不用考虑前面提到那种wheel特有的方法了,整个事情应该更简单了。你只需要给你的QApplication添加一个事件过滤器,截获非焦点Widget的wheel事件然后send到焦点widget就行了。

或者你override掉QApplication的notify函数也可以。
dbzhang800 2011-04-29
  • 打赏
  • 举报
回复
前面的描述有些乱,重新整理了一下,发在了blog中:

QWheelEvent 使用分析一例
wsrlyk 2011-04-29
  • 打赏
  • 举报
回复
good,对于单个spinbox的问题可以解决。
不过感觉对于两个spinbox,或者说资源管理器那种问题不太好搞定啊。因为资源管理器左右列表都会处理wheelEvent,所以第一时间就接受事件了

[Quote=引用 8 楼 dbzhang800 的回复:]

引用 7 楼 wsrlyk 的回复:

额,虽然我自认为已经理解了你打星号的两句话的意思,但我还是没懂到底可不可以实现我说的…………
因为wheelEvent是很多widget都会处理的,但我想要的效果就是即使把鼠标移到可以处理wheelEvent的widget上,event依然发送给焦点。就好像资源管理器左边的树形列表和右边的文件列表这两个widget。
看那个解释似乎是不行的咯?
……
[/Quote]
wsrlyk 2011-04-29
  • 打赏
  • 举报
回复
好的,明天试试
[Quote=引用 8 楼 dbzhang800 的回复:]

引用 7 楼 wsrlyk 的回复:

额,虽然我自认为已经理解了你打星号的两句话的意思,但我还是没懂到底可不可以实现我说的…………
因为wheelEvent是很多widget都会处理的,但我想要的效果就是即使把鼠标移到可以处理wheelEvent的widget上,event依然发送给焦点。就好像资源管理器左边的树形列表和右边的文件列表这两个widget。
看那个解释似乎是不行的咯?
……
[/Quote]
dbzhang800 2011-04-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wsrlyk 的回复:]

额,虽然我自认为已经理解了你打星号的两句话的意思,但我还是没懂到底可不可以实现我说的…………
因为wheelEvent是很多widget都会处理的,但我想要的效果就是即使把鼠标移到可以处理wheelEvent的widget上,event依然发送给焦点。就好像资源管理器左边的树形列表和右边的文件列表这两个widget。
看那个解释似乎是不行的咯?

引用 5 楼 dbzhang800 的回……
[/Quote]
你肯定没看懂,因为我写完后,发现自己都看不懂啥意思。估计很多人会有疑问,所以整理到了blog中。

其实答案一直都是明确的:你的要求可以实现。
wsrlyk 2011-04-29
  • 打赏
  • 举报
回复
额,虽然我自认为已经理解了你打星号的两句话的意思,但我还是没懂到底可不可以实现我说的…………
因为wheelEvent是很多widget都会处理的,但我想要的效果就是即使把鼠标移到可以处理wheelEvent的widget上,event依然发送给焦点。就好像资源管理器左边的树形列表和右边的文件列表这两个widget。
看那个解释似乎是不行的咯?

[Quote=引用 5 楼 dbzhang800 的回复:]

引用 4 楼 wsrlyk 的回复:

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

引用 3 楼 chenmoc1w2 的回复:

but if that wid……
……
[/Quote]
wsrlyk 2011-04-28
  • 打赏
  • 举报
回复
理论上是的。那我如果鼠标移到任务栏上呢?

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

[Quote=引用 3 楼 chenmoc1w2 的回复:]

but if that widget does not handle the event they are sent to the focus widget.
[/Quote]
dbzhang800 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wsrlyk 的回复:]

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

引用 3 楼 chenmoc1w2 的回复:

but if that wid……
[/Quote]
呵呵,和我原来的理解一样。理解成了一种事件转发。

这个理解是错误的,因为转发只会向上层转发(http://hi.baidu.com/cyclone/blog/item/fe6ab3de0e9f2155ccbf1aea.html)。

可以看看这篇文章“事件循环”一节 前面的一段,解释了这段话的含义(以及focus的widget指代的什么)
http://blog.csdn.net/dbzhang800/archive/2011/04/28/6370300.aspx

* 首先发送给当前光标下的widget(如果它的各种事件过滤器没将其过滤,而且event和wheelEvent也没accept它,事件会向上层窗体转发,直到top widget)。
* 经历上面所有的操作后,如果QWheelEvent事件仍未被处理,则会派发到 QApplication::focusWidget() 窗体(该窗体中,同样会经历事件过滤等等东西)
yuliang_87 2011-04-27
  • 打赏
  • 举报
回复
but if that widget does not handle the event they are sent to the focus widget.
wsrlyk 2011-04-27
  • 打赏
  • 举报
回复
那是不是说就没办法实现鼠标移到别的地方依然能控制焦点widget了?
但我觉得这是很普遍的一个功能啊…………

[Quote=引用 1 楼 dbzhang800 的回复:]

QWheelEvent 中说的清楚:

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.
[/Quote]
dbzhang800 2011-04-27
  • 打赏
  • 举报
回复
QWheelEvent 中说的清楚:

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.

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧