Python PyQt5 如何用 QWidget 显示完整的 QMenuBar
Python PyQt5 how to show the full QMenuBar with a QWidget
我在使用 QMenuBar
时得到了这个奇怪的结果 我以前在 QMenuBar
中使用过这个确切的代码并且它工作得很好。但是显示不超过 1 QMenu
这是我的代码:
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
from functools import partial
class MainMenu(QWidget):
def __init__(self, parent = None):
super(MainMenu, self).__init__(parent)
# background = QWidget(self)
lay = QVBoxLayout(self)
lay.setContentsMargins(5, 35, 5, 5)
self.menu()
self.setWindowTitle('Control Panel')
self.setWindowIcon(self.style().standardIcon(getattr(QStyle, 'SP_DialogNoButton')))
self.grid = QGridLayout()
lay.addLayout(self.grid)
self.setLayout(lay)
self.setMinimumSize(400, 320)
def menu(self):
menubar = QMenuBar(self)
viewMenu = menubar.addMenu('View')
viewStatAct = QAction('Dark mode', self, checkable=True)
viewStatAct.setStatusTip('enable/disable Dark mode')
viewMenu.addAction(viewStatAct)
settingsMenu = menubar.addMenu('Configuration')
email = QAction('Set Email', self)
settingsMenu.addAction(email)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = MainMenu()
main.show()
sys.exit(app.exec_())
结果:
我知道我在使用 QWidget
而我应该使用 QMainWindow
但有没有解决方法???
(图片质量太差了先说声抱歉,没有好办法拍一张QMenuBar
)
问题是,对于 QWidget,您没有使用 QMainWindow 具有的“private”布局,它会自动调整特定子部件(包括菜单栏、状态栏、停靠栏小部件、工具栏,显然还有“centralWidget
”)。
请记住,QMainWindow 有自己的布局(不能也不应更改),因为它需要特定的自定义布局来 布置 上述小部件。如果您想为主要 window 设置布局,则需要将其应用到其 centralWidget
。
仔细阅读 Main Window Framework 的行为;如文档所述:
Note: Creating a main window without a central widget is not supported. You must have a central widget even if it is just a placeholder.
为了在使用基本 QWidget 时解决这个问题,您必须相应地手动调整子窗口小部件的大小。在你的情况下,你只需要调整菜单栏的大小,只要你有对它的引用:
def menu(self):
self.menubar = QMenuBar(self)
# any other function has to be run against the *self.menubar* object
viewMenu = self.menubar.addMenu('View')
# etcetera...
def resizeEvent(self, event):
# calling the base class resizeEvent function is not usually
# required, but it is for certain widgets (especially item views
# or scroll areas), so just call it anyway, just to be sure, as
# it's a good habit to do that for most widget classes
super(MainMenu, self).resizeEvent(event)
# now that we have a direct reference to the menubar widget, we are
# also able to resize it, allowing all actions to be shown (as long
# as they are within the provided size
self.menubar.resize(self.width(), self.menubar.height())
注意:您也可以通过 self.findChild(QtWidgets.QMenuBar)
或使用 objectName
来“查找”菜单栏,但使用实例属性通常是更简单、更好的解决方案。
我在使用 QMenuBar
时得到了这个奇怪的结果 我以前在 QMenuBar
中使用过这个确切的代码并且它工作得很好。但是显示不超过 1 QMenu
这是我的代码:
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
from functools import partial
class MainMenu(QWidget):
def __init__(self, parent = None):
super(MainMenu, self).__init__(parent)
# background = QWidget(self)
lay = QVBoxLayout(self)
lay.setContentsMargins(5, 35, 5, 5)
self.menu()
self.setWindowTitle('Control Panel')
self.setWindowIcon(self.style().standardIcon(getattr(QStyle, 'SP_DialogNoButton')))
self.grid = QGridLayout()
lay.addLayout(self.grid)
self.setLayout(lay)
self.setMinimumSize(400, 320)
def menu(self):
menubar = QMenuBar(self)
viewMenu = menubar.addMenu('View')
viewStatAct = QAction('Dark mode', self, checkable=True)
viewStatAct.setStatusTip('enable/disable Dark mode')
viewMenu.addAction(viewStatAct)
settingsMenu = menubar.addMenu('Configuration')
email = QAction('Set Email', self)
settingsMenu.addAction(email)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = MainMenu()
main.show()
sys.exit(app.exec_())
结果:
我知道我在使用 QWidget
而我应该使用 QMainWindow
但有没有解决方法???
(图片质量太差了先说声抱歉,没有好办法拍一张QMenuBar
)
问题是,对于 QWidget,您没有使用 QMainWindow 具有的“private”布局,它会自动调整特定子部件(包括菜单栏、状态栏、停靠栏小部件、工具栏,显然还有“centralWidget
”)。
请记住,QMainWindow 有自己的布局(不能也不应更改),因为它需要特定的自定义布局来 布置 上述小部件。如果您想为主要 window 设置布局,则需要将其应用到其 centralWidget
。
仔细阅读 Main Window Framework 的行为;如文档所述:
Note: Creating a main window without a central widget is not supported. You must have a central widget even if it is just a placeholder.
为了在使用基本 QWidget 时解决这个问题,您必须相应地手动调整子窗口小部件的大小。在你的情况下,你只需要调整菜单栏的大小,只要你有对它的引用:
def menu(self):
self.menubar = QMenuBar(self)
# any other function has to be run against the *self.menubar* object
viewMenu = self.menubar.addMenu('View')
# etcetera...
def resizeEvent(self, event):
# calling the base class resizeEvent function is not usually
# required, but it is for certain widgets (especially item views
# or scroll areas), so just call it anyway, just to be sure, as
# it's a good habit to do that for most widget classes
super(MainMenu, self).resizeEvent(event)
# now that we have a direct reference to the menubar widget, we are
# also able to resize it, allowing all actions to be shown (as long
# as they are within the provided size
self.menubar.resize(self.width(), self.menubar.height())
注意:您也可以通过 self.findChild(QtWidgets.QMenuBar)
或使用 objectName
来“查找”菜单栏,但使用实例属性通常是更简单、更好的解决方案。