PyQt5中的menuBar()

Ewo*_*ugz -2 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.addMenu('Edit')        
Run Code Online (Sandbox Code Playgroud)

错误信息:

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'
Run Code Online (Sandbox Code Playgroud)

我在这里想念的是什么

更新项目:

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()
Run Code Online (Sandbox Code Playgroud)

9do*_*ogs 9

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

QMainWindow布局

如果您QMainWindow的代码中有某个实例并且只想在EmailBlastinit中填充菜单项,则可以QMainWindow通过调用获得所提到的菜单栏bar = QtWidgets.QMainWindow.menuBar().菜单由QActions 组成,因此您可能还需要添加它们.

如果你没有,QMainWindow那么考虑添加一个.QMainWindow必须有"中央小工具".在你的情况下,它可能是EmailBlast小部件.因为EmailBlast将是MainWindow您需要创建和显示MainWindow实例的一部分而不是EmailBlast.

如果你在EmailBlast小部件中有多个元素(按钮,文本编辑等),那么Qt 布局系统几乎不可避免地发挥作用(快速浏览文档中的图片来掌握一个概念).

要立刻围绕所有这些事情是非常困难的,所以再一次.

QMainWindow - 您应用的核心部分.有中央小部件占用的菜单栏,工具栏,状态栏和中心区域.

中央窗口小部件 - 提供应用程序主要功能的窗口小部件(或者它可以是包含其他窗口小部件的窗口小部件,如QSplitter).在你的情况下,它可能是一个EmailBlast小部件.

EmailBlast小部件提供了一段(可重用)功能.为此,它本身包含各种帮助小部件(文本编辑,按钮,复选框等).要以可预测的方式放置这些小小部件,将创建布局.窗口小部件放置在布局内,布局设置为EmailBlast窗口小部件.

菜单栏由零个或多个QMenu组成,而QMenu又可以具有QAction.QAction信号(通常triggered)连接到插槽以提供所需的行为.

这是一个完整的例子:

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_())
Run Code Online (Sandbox Code Playgroud)

这段代码产生了很好的小应用程序:

应用程序窗口