macOS 上的 PyQt5。添加到 QMainWindow 的自定义 QMenuBar 不可点击

Posted

技术标签:

【中文标题】macOS 上的 PyQt5。添加到 QMainWindow 的自定义 QMenuBar 不可点击【英文标题】:PyQt5 on MacOs. Custom QMenuBar added to QMainWindow is not clickable 【发布时间】:2020-09-09 19:33:40 【问题描述】:
class MenuBarWidget(QMenuBar):
    sig_new_file = pyqtSignal()
    sig_open_file = pyqtSignal()
    sig_save_file = pyqtSignal()
    sig_page_setup = pyqtSignal()
    sig_print = pyqtSignal()
    sig_exit = pyqtSignal()
    sig_status_bar = pyqtSignal(bool)

def __init__(self):
    super().__init__()
    self.init_menu_file()

    # self.init_menu_edit()
    # self.init_menu_format()
    # self.init_menu_view()
    # self.init_menu_help()
    # self.set_all_text()

def init_menu_file(self):
    self.act_new_file = QAction('File', self)
    self.act_new_file.setShortcut(QKeySequence('Ctrl+N'))
    self.act_new_file.triggered.connect(lambda: self.sig_new_file.emit())

    self.act_open_file = QAction('Open', self)
    self.act_open_file.setShortcut(QKeySequence('Ctrl+O'))
    self.act_new_file.triggered.connect(lambda: self.sig_open_file.emit())

    self.act_save_file = QAction('Save', self)
    self.act_save_file.setShortcut(QKeySequence('Ctrl+S'))
    self.act_save_file.triggered.connect(lambda: self.sig_save_file.emit())

    self.act_print = QAction('Print', self)
    self.act_print.setShortcut(QKeySequence('Ctrl+P'))
    self.act_print.triggered.connect(lambda: self.sig_print.emit())

    self.act_quit = QAction('Quit', self)
    self.act_quit.setShortcut(QKeySequence('Ctrl+Q'))
    self.act_quit.triggered.connect(lambda: self.sig_exit.emit())

    self.menu_file = self.addMenu('&File')
    self.menu_file.addAction(self.act_new_file)
    self.menu_file.addAction(self.act_open_file)
    self.menu_file.addAction(self.act_save_file)
    self.menu_file.addSeparator()
    self.menu_file.addAction(self.act_print)
    self.menu_file.addSeparator()
    self.menu_file.addAction(self.act_quit)


if __name__ == '__main__':

class Form(QMainWindow):

    sig_new_file = pyqtSignal()

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.resize(640, 480)
        self.setWindowTitle('MenuBar')
        self.menu = MenuBarWidget()
        self.setMenuBar(self.menu)

app = QApplication(sys.argv)
form = Form()
form.show()
exit(app.exec_())

我想用 PyQt 5.15 在 MacOs 10.15.6 上为窗口制作一个菜单栏

我将 QMenuBar 类用于自定义菜单栏,在“文件”菜单下创建了一些子菜单并将其添加到 QMainWindow 我可以看到全局菜单栏是在显示屏顶部创建的,就像其他 MacO 一样。

我都试过了

QMenuBar()  , QMainWIndow.setMenuBar()
sub_menu = QAction('Someting else..',self)

fileMenu = QMainWindow.menuBar().addMenu('File')
fileMenu.addAction(sub_menu)

但是创建的全局菜单栏不可点击。我点击了它,但它没有在“文件”菜单下方显示子菜单。

但是这种方式使用下面的“setNativeMenuBar(False)”可以像 Windows 应用程序一样工作,但我想使用原生 MacOs 菜单栏

QMainWindow.menuBar() and QMainWindow.setNativeMenuBar(False)

这是图片。

https://imgur.com/a/Yp6c9YW

【问题讨论】:

什么版本的 Qt 和 OS X?我没有在 PyQt5 5.9.2、macOS 10.10 上重现该问题 @alec 抱歉没有提及。 Anaconda virtualenv 上的 PyQt5 5.15.0,macOS 10.15.6。我不知道这个错误是由于我对 QMenuBar 和 QMainWndows 的不好理解而发生的,或者这只是版本不兼容.. 【参考方案1】:
# This worked on PyQt5 on macOS Big Sur (ver 11.6)
#    it is the result on painful trial and error
#    and reading the Qt Docs

    def _createMenuBar(self):
        menuBar = self.menuBar()

        # File menu
        fileMenu = menuBar.addMenu("File")
        fileMenu.addAction("New")

        save = QAction("Save",self)
        save.setShortcut("Ctrl+S")
        fileMenu.addAction(save)

        quit = QAction("\0Quit",self)
        quit.setShortcut("Ctrl+Q")
        fileMenu.addAction(quit)

        # Edit menu
        editMenu = menuBar.addMenu("Edit")
        editMenu.addAction("Copy")
        editMenu.addAction("Paste")

        # Help menu
        helpMenu=menuBar.addMenu("Help")
        helpMenu.addAction(self.helpContentAction)
        helpMenu.addAction(self.aboutAction)

【讨论】:

【参考方案2】:

这可能会有所帮助 从 PyQt5.QtWidgets 导入 QMenuBar

Mainmenu=self.menuBar();# 创建一个菜单栏小部件

Filemenu=Mainmenu.addMenu('file');#this 添加文件到菜单栏

Editmenu=Mainmenu.addMenu('Edit');#这将编辑添加到菜单栏

【讨论】:

以上是关于macOS 上的 PyQt5。添加到 QMainWindow 的自定义 QMenuBar 不可点击的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 macOS 使用

PyQt5 动态将 QFormLayouts 添加到 QTabWidget 的选项卡中

PyQt5,MacOS - 强制 GUI 坚持当前打开的桌面空间

在macos上基于python2.7安装PyQt5

在 macOS 上安装 pyqt5-tools

无法在 Qt 设计器(macos)中显示自定义 PyQt5 小部件插件