我试图使用工具属性在菜单栏项目上添加工具提示,但它似乎没有起作用... 但在标签、推按钮和其他小部件上,它似乎运作良好。是否有人可以帮助我解决这个问题?
testQMenuBarToolTip.cc
:
// Qt header:
#include <QtWidgets>
/// menu bar with tooltips
class MenuBar: public QMenuBar {
public:
explicit MenuBar(QWidget *pQParent = nullptr): QMenuBar(pQParent) { }
virtual ~MenuBar() = default;
MenuBar(const MenuBar&) = delete;
MenuBar& operator=(const MenuBar&) = delete;
protected:
virtual bool event(QEvent *pQEvent) override;
};
bool MenuBar::event(QEvent *pQEvent)
{
// keep behavior of base class
bool ret = QMenuBar::event(pQEvent);
// check whether this is a help event
if (pQEvent->type() == QEvent::ToolTip) {
const QHelpEvent *const pQHelpEvent = (const QHelpEvent*)pQEvent;
const QAction *pQAction = activeAction();
if (pQAction && !pQAction->toolTip().isEmpty()) {
QToolTip::showText(pQHelpEvent->globalPos(), pQAction->toolTip());
return ret;
}
}
QToolTip::hideText();
return ret;
}
/// menu with tooltips
class Menu: public QMenu {
public:
explicit Menu(const QString &title, QWidget *pQParent = nullptr):
QMenu(title, pQParent)
{ }
explicit Menu(QWidget *pQParent = nullptr): QMenu(pQParent) { }
virtual ~Menu() = default;
Menu(const Menu&) = delete;
Menu& operator=(const Menu&) = delete;
protected:
virtual bool event(QEvent *pQEvent) override;
};
bool Menu::event(QEvent *pQEvent)
{
// keep behavior of base class
bool ret = QMenu::event(pQEvent);
// check whether this is a help event
if (pQEvent->type() == QEvent::ToolTip) {
const QHelpEvent *const pQHelpEvent = (const QHelpEvent*)pQEvent;
const QAction *pQAction = activeAction();
if (pQAction && !pQAction->toolTip().isEmpty()) {
QToolTip::showText(pQHelpEvent->globalPos(), pQAction->toolTip());
return ret;
}
}
QToolTip::hideText();
return ret;
}
// main application
int main(int argc, char **argv)
{
qDebug() << "Qt Version:" << QT_VERSION_STR;
QApplication app(argc, argv);
// setup GUI
QMainWindow qWinMain;
qWinMain.resize(320, 240);
qWinMain.setWindowTitle("Test QMenuBar with ToolTips");
MenuBar qMenuBar;
QAction qCmdFile("File");
qCmdFile.setToolTip("provides file commands.");
Menu qMenuFile;
QAction qCmdExit("Quit");
qCmdExit.setToolTip("closes application.");
qMenuFile.addAction(&qCmdExit);
qCmdFile.setMenu(&qMenuFile);
qMenuBar.addAction(&qCmdFile);
qWinMain.setMenuBar(&qMenuBar);
#if 0 // comparison with toolbar
QToolBar qToolBar;
qToolBar.addAction(&qCmdExit);
qWinMain.addToolBar(&qToolBar);
#endif // 0
qWinMain.show();
// runtime loop
return app.exec();
}
testQMenuBarToolTip.pro
:
SOURCES = testQMenuBarToolTips.cc
QT += widgets
使用 cygwin64 构建并测试:
$ qmake-qt5
$ make && ./testQMenuBarToolTips
g++ -c -fno-keep-inline-dllexport -D_GNU_SOURCE -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -isystem /usr/include/qt5 -isystem /usr/include/qt5/QtWidgets -isystem /usr/include/qt5/QtGui -isystem /usr/include/qt5/QtCore -I. -I/usr/lib/qt5/mkspecs/cygwin-g++ -o testQMenuBarToolTips.o testQMenuBarToolTips.cc
g++ -o testQMenuBarToolTips.exe testQMenuBarToolTips.o -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread
Qt Version: 5.9.4
输出:(cygwin64,X11,g ++,Qt 5.9)
注意:
我对从中复制的答案进行了一些微调(例如添加了缺失的返回语句)。
在调整我的示例时,我意识到子菜单存在相同的问题,并编写了QMenu
的解决方案。
setToolTipsVisible(true);
,参见这里。 - florisla