How to include tooltips for menu items in qt

1.5k Views Asked by At

I'm trying to add ToolTips on MenuBar Items using the tool properties but it didn't work... But on labels, pushbuttons and other widgets it seems to work pretty fine. Can anyone help me with this?

2

There are 2 best solutions below

0
On BEST ANSWER

Due to the lack of an MCVE, I prepared my own and was able to reproduce the issue of OP. (I tested with Windows/VS2017/Qt 5.13 and in cygwin/X11/Qt 5.9.)

Researching the web, I found a similar Q/A in the Qt Forum:

(Solved) setToolTip in QAction menu.

As I already had an MCVE, I tried that solution and got it working (in 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

Output: (Windows 10, VS2017, Qt 5.13)

Snapshot of testQMenuBarToolTips (Mouse over menu bar item) Snapshot of testQMenuBarToolTips (Mouse over menu item)

Built and tested in cygwin64 with:

$ 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

Output: (cygwin64, X11, g++, Qt 5.9)

Snapshot of testQMenuBarToolTips (Mouse over menu bar item) Snapshot of testQMenuBarToolTips (Mouse over menu item)

Notes:

  • I applied some fine-tuning to the answer I copied from (e.g. adding missing return statements).

  • While fiddling with my sample, I realized the same issue with the sub-menu and copy/paste programmed the solution for QMenu as well.

0
On

Here is how I make tooltips work by setting the property in Qt Desinger.

  • I use VS2022 and Qt6.4.2_msv2019_64.
  • After I create a QtWidgets project, I add "File" -> "Open" on Menu bar in Qt Designer.
  • For "Open" Property, I set "toolTip": Open config file.
  • In Object Inspector, I select "menuFile" and check "toolTipsVisible". enter image description here

enter image description here