You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5:如何为QMenu及子菜单显示statustip状态提示

问题描述

如何为QMenu(菜单)及其子菜单显示状态提示信息"1"和"1.1"?目前二级菜单项"1.1.1"和"1.1.2"的状态提示显示正常。是否可以在QtDesigner中无需编写额外代码实现该功能?

编辑补充:这是Qt的已知问题(QTBUG-3810)


相关代码
# -*- 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_())

解决方案

原因说明

QMenu本身的setStatusTip()不会自动触发状态栏显示,因为菜单栏上实际显示的是QMenu对应的QAction(通过menuAction()获取),而非QMenu本身。直接给QMenu设置状态提示无效,必须给它对应的action设置状态提示。

方法1:代码修改实现

在setupUi方法中,给菜单对应的action添加状态提示,修改后代码片段如下:

def setupUi(self, MainWindow):
        # ... 原有代码保持不变 ...
        self.menubar.addAction(self.menu1.menuAction())

        # 添加以下两行,给菜单对应的action设置状态提示
        self.menu1.menuAction().setStatusTip(_translate("MainWindow", "1"))
        self.menu1_1.menuAction().setStatusTip(_translate("MainWindow", "1.1"))

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

方法2:QtDesigner中实现的限制

QtDesigner本身不支持直接给QMenu的对应action设置状态提示,因为界面编辑器无法直接选中QMenu的menuAction()对象。没有无需额外代码的纯设计器实现方式,最可靠的方案还是通过上述代码修改完成。


内容的提问来源于stack exchange,提问作者Chris P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 19:47:38