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
相关产品推荐
相关产品推荐

