我正在尝试将菜单栏加载到我的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()
答案 0 :(得分:9)
异常说实话:QWidget
类没有menuBar
属性,QMainWindow具有(以及工具栏和状态栏):
如果您的代码中某处有QMainWindow
个实例,并且只想在EmailBlast
初始化中填充菜单项,则可以通过调用QMainWindow
获取上述bar = QtWidgets.QMainWindow.menuBar()
的菜单栏。菜单由QAction
组成,因此您可能还需要添加它们。
如果您没有QMainWindow
,请考虑添加一个。 QMainWindow
必须拥有" Central Widget"。在您的情况下,它可能是EmailBlast
小部件。由于EmailBlast
将成为MainWindow
的一部分,因此您需要创建并显示MainWindow
个实例,而不是EmailBlast
。
如果EmailBlast
窗口小部件中有多个元素(按钮,文本编辑等),那么Qt layout system几乎不可避免地发挥作用(快速浏览文档中的图片以掌握概念)。
要立刻围绕所有这些事情是非常困难的,所以再一次。
QMainWindow - 您应用的核心部分。有中央小部件占用的菜单栏,工具栏,状态栏和中心区域。
中央小部件 - 提供应用主要功能的小部件(或者可以是包含其他小部件的小部件,如QSplitter)。在您的情况下,它可能是EmailBlast
小部件。
EmailBlast 小部件提供了一段(可重复使用的)功能。为此,它本身包含各种帮助小部件(文本编辑,按钮,复选框等)。要以可预测的方式放置这些小小部件,将创建布局。窗口小部件放置在布局内,布局设置为EmailBlast
窗口小部件。
菜单栏由零个或多个QMenu组成,而QAction s又可以包含个。 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_())
这段代码产生了很好的小应用程序: