如何在qt中包含菜单项的工具提示
How to include tooltips for menu items in qt
我正在尝试使用工具属性在 MenuBar 项目上添加工具提示,但它不起作用...但在标签、按钮和其他小部件上它似乎工作得很好。谁能帮我解决这个问题?
由于缺少 MCVE,我准备了自己的并且能够重现 OP 的问题。
(我在 Windows/VS2017/Qt 5.13 和 cygwin/X11/Qt 5.9 中进行了测试。)
研究网络,我在Qt论坛中找到了类似的Q/A:
(Solved) setToolTip in QAction menu.
因为我已经有一个 MCVE,所以我尝试了那个解决方案并让它工作(在 Windows/VS2017/Qt 5.13 中)。
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
输出:(Windows10,VS2017,Qt 5.13)
在 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)
备注:
我对我复制的答案进行了一些微调(例如添加缺失的 return 语句)。
在摆弄我的示例时,我意识到子菜单存在同样的问题,因此 copy/paste 也为 QMenu
编写了解决方案。
我正在尝试使用工具属性在 MenuBar 项目上添加工具提示,但它不起作用...但在标签、按钮和其他小部件上它似乎工作得很好。谁能帮我解决这个问题?
由于缺少 MCVE,我准备了自己的并且能够重现 OP 的问题。 (我在 Windows/VS2017/Qt 5.13 和 cygwin/X11/Qt 5.9 中进行了测试。)
研究网络,我在Qt论坛中找到了类似的Q/A:
(Solved) setToolTip in QAction menu.
因为我已经有一个 MCVE,所以我尝试了那个解决方案并让它工作(在 Windows/VS2017/Qt 5.13 中)。
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
输出:(Windows10,VS2017,Qt 5.13)
在 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)
备注:
我对我复制的答案进行了一些微调(例如添加缺失的 return 语句)。
在摆弄我的示例时,我意识到子菜单存在同样的问题,因此 copy/paste 也为
QMenu
编写了解决方案。