0

QMenuBar使用我之前使用过这个确切的代码时,我得到了这个奇怪的结果QMenuBar,它工作得很好。但它不显示超过 1QMenu

这是我的代码:

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

4

1 回答 1

1

问题在于,对于 QWidget,您没有使用 QMainWindow 具有的“私有”布局,它会自动调整特定子小部件(包括菜单栏、状态栏、停靠小部件、工具栏,显然还有“ centralWidget”)的大小。
请记住,QMainWindow 有自己的布局(不能也不应该更改),因为它需要特定的自定义布局来布置上述小部件。如果要为主窗口设置布局,则需要将其应用到其centralWidget.

仔细阅读主窗口框架的行为方式);正如文档报告的那样:

注意:不支持创建没有中央小部件的主窗口。即使它只是一个占位符,您也必须有一个中央小部件。

为了在使用基本 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,但使用实例属性通常是一种更简单、更好的解决方案。

于 2019-12-15T05:50:49.763 回答