为QMenu添加对QAction的tooltip的支持

QAction提供了setToolTip函数, 可以给action指定一个工具提示内容。 按照笔者的理解, 这样应该所有用到QAction的地方在鼠标停留时都应该显示出这个工具提示。 哪些地方会用到QAction呢, 简单罗列: QMenu, QToolBar, QMenuBar, 但实际上能直接支持QAction工具提示的也只有QToolBar而已。 看了看QMenu的实现, 发现这个类果然对工具提示没有做任何处理, 所以它最多能显示出QWidget支持的默认工具提示, 想让它显示QAction对应的提示就得自己想别的办法了。

要我说, 这个应该算是bug, 因为从文档来看是揣测不到这样的现实的。 不过这样的问题如果报告给官方, 最多也就被划入feature request范畴, 解决之日也必是遥遥无期, 还不如自力更生算了。
解决的方法是派生QMenu, 重写bool event(QEvent*)虚函数, 在其中处理QEvent::ToolTip事件。 这个事件在需要显示tooltip时发出, 所以我们响应该事件只需要在适当位置显示适当的工具提示内容即可。
如下代码:

bool Menu::event(QEvent* e)
{
switch(e->type())
{
case QEvent::ToolTip:
//show action tooltip instead of widget tooltip
{
QHelpEvent* he = dynamic_cast(e);
QAction* act = actionAt(he->pos());
if( act )
{
QToolTip::showText(he->globalPos(), act->toolTip(), this);
return true;
}
}
break;
}
QMenu::event(e);
}

三点注意事项:
- 获取鼠标位置的QAction用的是相对于Menu的坐标, 而显示ToolTip用的是全局坐标
- 显示tooltip之后要返回ture,表示当前ToolTip事件已经被处理。 不然底层继续处理该事件就会显示出QWidget设置的工具提示
- 函数最后要调用基类的event函数, 继续其他事件的处理

原文链接:http://www.cuteqt.com/blog/?p=1995

你可能感兴趣的:(软件开发技术)