当 centralwidget 添加到 qmainwindow 时,菜单栏不是 working/disappearing

menubar not working/disappearing when centralwidget is added to qmainwindow

我正在使用 PyQt5。我的问题是在 centralwidget 添加到 QMainWindow 后无法点击菜单栏。

我在 Linux 服务器上使用 python 3.7。

这是我遇到的问题的 MWE:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, qApp, QWidget, QVBoxLayout


class Ui_MainWindow(object):

    def initUI(self,MyMainWindow):

        exitAction = QAction('Exit', MyMainWindow)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.triggered.connect(qApp.quit)

        menubar = MyMainWindow.menuBar()
        menubar.setNativeMenuBar(False)
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAction)

        MyMainWindow.setWindowTitle('Menubar')
        MyMainWindow.setGeometry(300, 300, 300, 200)

        self.vbox = QVBoxLayout()
        self.centralwidget = QWidget(MyMainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.centralwidget.setLayout(self.vbox)


if __name__ == '__main__':

    app = QApplication(sys.argv)
    MyMainWindow = QMainWindow()
    ui = Ui_MainWindow()
    ui.initUI(MyMainWindow)
    MyMainWindow.show()
    sys.exit(app.exec_())

我已经制作了示例,因此它的格式与我正在处理的原始代码相似。在当前形式下,当我 运行 代码时,会显示一个菜单栏,但无法单击。然而,当用于生成布局的 4 行和 centralwidget 被禁用时,菜单栏工作正常。

在我的原始代码(此处未显示)中,菜单栏甚至根本没有显示,而且我没有使用 Mac OS X,因为我已经看到别人的问题。对我来说,唯一的区别似乎是 centralwidget 的存在。我是否应该为菜单栏和中央小部件分配单独的空间,或一些其他配置设置来使其工作?

没有错误消息,只是菜单栏没有 work/show 在代码生成的 MainWindow 上。

任何帮助将不胜感激。

为了更好地理解问题,让我们添加一些颜色:

# ...
self.centralwidget.setLayout(self.vbox)
self.centralwidget.setStyleSheet("background-color: yellow")
# ...

之前:

之后:

如您所见,self.centralwidget 小部件位于 QMenuBar 上,阻止鼠标事件到达 QMenuBar。

为什么会这样? QMainWindow 是否已经有一个预定义的布局:

因此,在这种情况下,您必须使用 setCentralWidget() 方法将 self.centralwidget 放置在 QMainWindow 的中心部件中:

# ...
self.vbox = QVBoxLayout()
self.centralwidget = QWidget(MyMainWindow)
self.centralwidget.setObjectName("centralwidget")
self.centralwidget.setLayout(self.vbox)
MyMainWindow.setCentralWidget(self.centralwidget) # <---