当 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) # <---
我正在使用 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) # <---