c++qtqmenuqtooltip

How to include tooltips for menu items in qt


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?


Solution

  • 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: