如何设置QMenuBar中的动作实现多行换行显示
问题原因
QMenuBar默认添加的QAction会使用内部单行文本控件进行渲染,会自动忽略文本中的\n换行符,因此直接给QAction文本设置换行符无法实现多行显示效果。
解决方案
方案1:自定义QWidgetAction实现(推荐,兼容性最好)
继承QWidgetAction自定义支持多行文本的动作类,内部使用支持换行的QLabel承载文本,用法和原生QAction完全一致:
from PyQt5.QtWidgets import QWidgetAction, QLabel # 自定义多行文本Action类 class MultiLineAction(QWidgetAction): def __init__(self, text, parent=None): super().__init__(parent) # 使用QLabel承载文本,支持手动插入\n换行 label = QLabel(text) # 也可开启自动换行,超出宽度后自动折行 # label.setWordWrap(True) label.setStyleSheet("padding: 4px 8px;") # 绑定点击事件触发原生triggered信号,和普通QAction用法一致 label.mousePressEvent = lambda e: self.triggered.emit() self.setDefaultWidget(label) # 替换原有QAction即可 self.menuBar = self.menuBar() self.action1 = MultiLineAction('This is\nAction Button', self) # 绑定槽函数的逻辑和原生QAction完全相同 self.action1.triggered.connect(你要绑定的槽函数) self.menuBar.addAction(self.action1)
方案2:样式表修改(实现简单,兼容性稍弱)
直接给QMenuBar设置样式表,强制修改菜单项的文本渲染规则,支持换行:
self.menuBar.setStyleSheet(""" QMenuBar::item { white-space: normal; padding: 4px 8px; } """) # 原有代码不需要修改,直接给QAction加\n即可生效 self.action1 = QAction('This is\nAction Button', self) self.menuBar.addAction(self.action1)
内容的提问来源于stack exchange,提问作者Mineral
相关产品推荐
相关产品推荐

