2

我正在尝试使用 Qt4.5 在 Qt/C++ 中创建一个应用程序,并希望任何活动窗口在鼠标悬停事件上更改不透明度...

据我了解,Qt 中没有明确的鼠标悬停事件。

但是,通过在声明我的主窗口的类中重新实现 QWidget 的 mousemoveevent(),我得到了基本功能。但是,只要鼠标经过我在其中创建的任何组框,就不会调用主窗口的 mousemoveevent(可以理解,因为 QGroupbox 有自己的 mousemoveevent 重新实现)。

因此,作为一种廉价的解决方法,我仍在使用主窗口的 mousemoveevent,但查询全局鼠标位置并基于主窗口的 (x,y) 位置(通过 ->pos() 获得)和窗口大小( -> 大小 -> rHeight 和 rWidth),我检查鼠标是否在主窗口区域的范围内并因此更改不透明度。

这取得了非常有限的成功。右边框工作正常,左边框提前 4 个像素改变不透明度。顶部不起作用(可能是因为鼠标穿过菜单栏和标题栏)并且底部更改得太早了。

我想创建一个空容器 QWidget 类,然后将所有其余部分放在那里,但我觉得如果它已经在子小部件中实现,它仍然无法解决基本小部件不接收 mousemoveevent 的大问题。

请提出我在我的方法中所做的任何更正/错误或任何替代方法来实现这一点。

ps 我怀疑这很重要,但我正在使用 Qt Creator IDE,而不是 Qt 集成到 VS2008 中(无论如何它是相同的类 - 虽然不同的编译器,mingw

4

3 回答 3

2

为您的每个子小部件安装事件过滤器可能会起到作用。这将允许您的主窗口接收子事件,例如来自您的分组框的事件。您可以在此处找到示例代码。

于 2009-04-21T02:40:27.187 回答
2

您可能对事件过滤器感兴趣。QObject 证明了一种拦截应用程序周围所有事件的方法。

http://doc.trolltech.com/4.5/eventsandfilters.html#event-filters

于 2009-04-21T02:48:27.510 回答
1

If I understand what you are attempting to do, I would reimplement the widget's enterEvent() and leaveEvent(). The mouse enter event would trigger the fade-in and the leaveEvent would trigger the fade-out.

EDIT: After re-reading several times, I'm still not sure what you are trying to accomplish. Sorry if my suggestion doesn't help. :-)

于 2009-04-21T02:52:19.140 回答