我试图使用工具属性在菜单栏项上添加工具提示,但它不起作用...但在标签、按钮和其他小部件上,它似乎工作得很好。谁能帮我这个?
由于缺少MCVE,我准备了自己的并且能够重现 OP 的问题。(我在 Windows/VS2017/Qt 5.13 和 cygwin/X11/Qt 5.9 中进行了测试。)
在网上查了一下,我在Qt论坛中发现了类似的Q/A:
由于我已经有了 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();
}
Run Code Online (Sandbox Code Playgroud)
testQMenuBarToolTip.pro:
// 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();
}
Run Code Online (Sandbox Code Playgroud)
输出:(Windows 10、VS2017、Qt 5.13)
在cygwin64中构建并测试:
SOURCES = testQMenuBarToolTips.cc
QT += widgets
Run Code Online (Sandbox Code Playgroud)
输出:(cygwin64、X11、g++、Qt 5.9)
笔记:
我对复制的答案进行了一些微调(例如添加缺少的返回语句)。
在摆弄我的示例时,我意识到子菜单也存在同样的问题,并复制/粘贴了解决方案QMenu。
| 归档时间: |
|
| 查看次数: |
1484 次 |
| 最近记录: |