Python PyQt5中的菜单栏()

Python PyQt5中的菜单栏(),python,menu,pyqt,pyqt5,Python,Menu,Pyqt,Pyqt5,我试图将菜单栏加载到gui中,但我的类对象没有self.menubar()的属性。有人能帮我吗,似乎没有教程提供任何方法 class EmailBlast(QtWidgets.QWidget): def __init__(self): super().__init__() bar = QtWidgets.menuBar() file_menu = bar.addMenu('File') file_edit = bar.ad

我试图将菜单栏加载到gui中,但我的类对象没有self.menubar()的属性。有人能帮我吗,似乎没有教程提供任何方法

class EmailBlast(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        bar = QtWidgets.menuBar() 
        file_menu = bar.addMenu('File')
        file_edit = bar.addMenu('Edit')        
错误消息:

File "BasicEmail.py", line 84, in email_config
self.ui = EmailBlast()
File "BasicEmail.py", line 96, in __init__
self.menuBar()
AttributeError: 'EmailBlast' object has no attribute 'menuBar'
我错过了什么

更新项目:

class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
    super().__init__()
    self.email_blast_widget = EmailBlast()
    self.setCentralWidget(self.email_blast_widget)
    bar = self.menuBar()
    file_file = bar.addMenu('File')         
    file_edit = bar.addMenu('Edit') 

class EmailBlast(QtWidgets.QWidget):
def __init__(self):
    super().__init__()
    self.text_box = QtWidgets.QTextEdit(self)
    self.save_button = QtWidgets.QPushButton('Save')
    self.clear_button = QtWidgets.QPushButton('Clear')        
    self.open_button = QtWidgets.QPushButton('Open')        
    self.init_ui()

异常说明了事实:
QWidget
类没有
menuBar
属性,具有(以及工具栏和状态栏):

如果您的代码中有
QMainWindow
实例,并且只想填充
EmailBlast
init中的菜单项,您可以通过调用
bar=qtwidts.QMainWindow.menuBar()
获得所提到的
QMainWindow
的菜单栏。菜单由
QAction
s组成,因此您可能也需要添加它们

如果你没有<代码> qWalthWindows ,那么考虑添加一个.<代码>QMainWindow必须具有“中心小部件”。在您的情况下,它可能是

EmailBlast
widget。由于
EmailBlast
将是
MainWindow
的一部分,因此您需要创建并显示
MainWindow
实例,而不是
EmailBlast

如果在
EmailBlast
小部件中有多个元素(按钮、文本编辑等),那么Qt几乎是不可避免的(快速浏览文档中的图片以掌握概念)

要一下子把所有这些事情都想清楚是很困难的,所以再一次

QMainWindow-应用程序的核心部分。具有菜单栏、工具栏、状态栏和中心小部件占用的中心区域

中心小部件-提供应用程序主要功能的小部件(也可以是包含其他小部件的小部件,如)。在您的情况下,它可能是一个
EmailBlast
小部件

EmailBlast小部件提供了一部分(可重用)功能。为此,它本身由各种助手小部件(文本编辑、按钮、复选框等)组成。为了以可预测的方式放置这些小部件,将创建布局。小部件放置在布局中,布局设置为
EmailBlast
widget

菜单栏由零个或多个s组成,而这些s又可以有s。QAction信号(通常是
触发的
)连接到插槽以提供所需的行为

下面是一个完整的示例:

import sys
from PyQt5 import QtWidgets


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        # creating EmailBlast widget and setting it as central
        self.email_blast_widget = EmailBlast(parent=self)
        self.setCentralWidget(self.email_blast_widget)
        # filling up a menu bar
        bar = self.menuBar()
        # File menu
        file_menu = bar.addMenu('File')
        # adding actions to file menu
        open_action = QtWidgets.QAction('Open', self)
        close_action = QtWidgets.QAction('Close', self)
        file_menu.addAction(open_action)
        file_menu.addAction(close_action)
        # Edit menu
        edit_menu = bar.addMenu('Edit')
        # adding actions to edit menu
        undo_action = QtWidgets.QAction('Undo', self)
        redo_action = QtWidgets.QAction('Redo', self)
        edit_menu.addAction(undo_action)
        edit_menu.addAction(redo_action)

        # use `connect` method to bind signals to desired behavior
        close_action.triggered.connect(self.close)


class EmailBlast(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        # create and set layout to place widgets
        grid_layout = QtWidgets.QGridLayout(self)

        self.text_box = QtWidgets.QTextEdit(self)
        self.save_button = QtWidgets.QPushButton('Save')
        self.clear_button = QtWidgets.QPushButton('Clear')
        self.open_button = QtWidgets.QPushButton('Open')
        # add widgets to layout. Params are:
        # (widget, fromRow, fromColumn, rowSpan=1, columnSpan=1)
        grid_layout.addWidget(self.text_box, 0, 0, 1, 3)
        grid_layout.addWidget(self.save_button, 1, 0)
        grid_layout.addWidget(self.clear_button, 1, 1)
        grid_layout.addWidget(self.open_button, 1, 2)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    # creating main window
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec_())
这段代码生成了这样一个漂亮的小应用程序:


我建议您将小部件放置在布局中,并将此布局放置在centralWidget中。这样做的目的是帮助问题的作者,如果您放置不起作用的代码,会使作者感到困惑。另一个选项是删除该零件并显示必要的代码。@eyllanesc,公平点。我试图更新答案,以尽量减少混淆。@Mikhail代码运行良好,显然是正确的方法。但是,我的菜单按钮仍然不会显示。@MikhailKnyazev,感谢您解释窗口与框架的概念。然而,我似乎无法让按钮出现。你能看看新代码吗?