我正在尝试使用Qt4.5在Qt / C ++中创建一个应用程序,并希望任何活动窗口在鼠标悬停事件中更改不透明度...
据我所知,Qt中没有明确的鼠标悬停事件。
但是,通过在声明我的主窗口的类中重新实现QWidget的mousemoveevent(),我得到了基本的功能。但是只要鼠标在我在那里创建的任何组合框上移动,就不会调用主窗口的mousemoveevent(可以理解的是,因为QGroupbox有自己的mousemoveevent重新实现)。
所以作为一个廉价的工作,我仍然使用我的主窗口的mousemoveevent但是查询全局鼠标位置并基于主窗口的(x,y)位置(通过 - > pos()获得)和窗口大小( - > size - >> rHeight和rWidth),我检查鼠标是否在主窗口区域的范围内,并因此改变不透明度。
这个成功非常有限。右边框工作正常,左边提前4像素不透明。顶部不起作用(可能是因为鼠标经过菜单栏和标题栏)而且底部变化太早。
我想创建一个空的容器QWidget类,然后把所有其余的放在那里,但我觉得它仍然无法解决基本小部件没有收到mousemoveevent的大问题,如果它已经在一个孩子中实现的窗口小部件。
请提出我在我的方法中所做的任何更正/错误或任何其他方法来实现此目的。
P.S。我怀疑这很重要,但我正在使用Qt Creator IDE,而不是Qt集成到VS2008中(不管怎样它是相同的类 - 不同的编译器, mingw )
答案 0 :(得分:2)
为每个子窗口小部件安装事件过滤器可能会有所帮助。这将允许您的主窗口接收子事件,例如来自组组框的子事件。您可以找到示例代码here。
答案 1 :(得分:2)
您可能对事件过滤器感兴趣。 QObject证明了一种拦截所有事件的方法。
http://doc.trolltech.com/4.5/eventsandfilters.html#event-filters
答案 2 :(得分:1)
如果我理解你要做什么,我会重新实现widget的enterEvent()和leaveEvent()。鼠标输入事件将触发淡入,而leaveEvent将触发淡出。
编辑:经过多次重读后,我仍然不确定你要完成什么。对不起,如果我的建议没有帮助。 : - )