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

PySide6菜单栏操作在macOS Sonoma 14.4.1中不显示问题求助

macOS Sonoma下PySide6菜单栏异常:File菜单仅显示最后一个动作

问题描述

在macOS Sonoma 14.4.1上开发带菜单栏的PySide6应用时出现以下异常:

  • File菜单必须添加多个动作才会显示
  • 菜单显示后仅能看到最后一个添加的动作(示例中为"Save"),之前添加的"Quit"动作不显示
    同一代码在Windows系统下运行完全正常。

代码片段

main.py

from PySide6.QtWidgets import QApplication
import sys
from mainwindow import MainWindow

app = QApplication(sys.argv)
window = MainWindow(app)
window.show()
app.exec()

mainwindow.py

from PySide6.QtWidgets import QMainWindow

class MainWindow(QMainWindow):
    def __init__(self, app):
        super().__init__()
        self.app = app
        self.setWindowTitle("Custom main window")

        menu_bar = self.menuBar()

        file_menu = menu_bar.addMenu("&File")

        file_menu.addAction("Quit")
        file_menu.addAction("Save")

系统信息

  • 操作系统:macOS Sonoma 14.4.1
  • PySide6版本:6.7.0
  • 切换到PyQt5后问题依旧

已尝试方法

  • 添加多个动作用以触发菜单显示
  • 调整动作添加顺序
  • 设置应用名称与组织名称:
app.setApplicationName("Custom App")
app.setOrganizationName("YourOrganization")

以上操作均未解决问题。

解决方案

这是Qt适配macOS系统行为导致的——Qt会自动将标准动作(如Quit、About等)迁移到屏幕顶部的系统菜单栏,而非窗口自身的菜单中。以下两种方法可以解决:

方法1:禁用Qt的macOS菜单栏自动整合

初始化QApplication后,添加代码关闭系统菜单整合,让所有动作显示在窗口菜单栏中:

from PySide6.QtCore import Qt

app = QApplication(sys.argv)
app.setAttribute(Qt.ApplicationAttribute.AA_DontUseNativeMenuBar, True)

此方法会让应用菜单栏行为和Windows完全一致。

方法2:手动指定动作的菜单角色

如果想保留macOS系统菜单特性,可通过设置动作的菜单角色,阻止Qt自动迁移:
修改mainwindow.py的代码:

from PySide6.QtWidgets import QMainWindow, QAction
from PySide6.QtGui import QAction

class MainWindow(QMainWindow):
    def __init__(self, app):
        super().__init__()
        self.app = app
        self.setWindowTitle("Custom main window")

        menu_bar = self.menuBar()
        file_menu = menu_bar.addMenu("&File")

        # 创建QAction并设置NoRole
        quit_action = QAction("Quit", self)
        quit_action.setMenuRole(QAction.MenuRole.NoRole)
        quit_action.triggered.connect(app.quit)
        file_menu.addAction(quit_action)

        save_action = QAction("Save", self)
        save_action.setMenuRole(QAction.MenuRole.NoRole)
        file_menu.addAction(save_action)

setMenuRole(QAction.MenuRole.NoRole)会告诉Qt不要将这些动作迁移到系统菜单栏,它们就会正常显示在自定义File菜单中。

补充说明

你可以检查屏幕顶部的系统菜单栏,被Qt自动迁移的Quit动作应该在那里。macOS的菜单栏逻辑与Windows差异较大,这是导致跨平台表现不一致的核心原因。

内容的提问来源于stack exchange,提问作者Mahmoud Hosny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 15:04:56