pythonpyqt5qmenuqstatusbar

Python - PyQt5 - How to show statustip for QMenu and submenu actions


# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'menu_example_statustip.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
        self.menubar.setObjectName("menubar")
        self.menu1 = QtWidgets.QMenu(self.menubar)
        self.menu1.setObjectName("menu1")
        self.menu1_1 = QtWidgets.QMenu(self.menu1)
        self.menu1_1.setObjectName("menu1_1")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.action1_1_1 = QtWidgets.QAction(MainWindow)
        self.action1_1_1.setObjectName("action1_1_1")
        self.action1_1_2 = QtWidgets.QAction(MainWindow)
        self.action1_1_2.setObjectName("action1_1_2")
        self.menu1_1.addAction(self.action1_1_1)
        self.menu1_1.addAction(self.action1_1_2)
        self.menu1.addAction(self.menu1_1.menuAction())
        self.menubar.addAction(self.menu1.menuAction())

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.menu1.setStatusTip(_translate("MainWindow", "1"))
        self.menu1.setTitle(_translate("MainWindow", "1"))
        self.menu1_1.setStatusTip(_translate("MainWindow", "1.1"))
        self.menu1_1.setTitle(_translate("MainWindow", "1.1"))
        self.action1_1_1.setText(_translate("MainWindow", "1.1.1"))
        self.action1_1_1.setStatusTip(_translate("MainWindow", "1.1.1"))
        self.action1_1_2.setText(_translate("MainWindow", "1.1.2"))
        self.action1_1_2.setStatusTip(_translate("MainWindow", "1.1.2"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Maybe a duplicate question.

How can I show the "1" status tip message and "1.1" status tip message for menu and submenu actions. For "1.1.1" and "1.1.2" there is no problem.

Is this possible without code in QtDesigner?

Edit: There is a related bug here.


Solution

  • The issue here is that you're setting the status-tip on the wrong object. You need to set it on the item that represents the menu, rather than the menu itself. This can be done via the menu's associated action, like this:

    menu.menuAction().setStatusTip('Hello World')
    

    It's a little surprising that this doesn't happen automatically. The menu-action does inherit the title and icon of the menu - so why not also its status-tip, tool-tip, etc? This would obviously be quite convenient for menus created in Qt Designer. I suppose a work-around might be something like this:

    for menu in MainWindow.findChildren(QtWidgets.QMenu):
        action = menu.menuAction()
        action.setStatusTip(menu.statusTip())
        action.setToolTip(menu.toolTip())