PyQt5—菜单栏与工具栏

it2022-05-09  16

菜单栏和工具栏


一、界面设计

MainWindows 即主窗口,主要包含菜单栏、工具栏和任务栏等

对于一级菜单,直接在 Qt Designer 的窗体设计编辑器中菜单栏的菜单项输入文本即可。

对于非一级菜单,即子菜单可以通过动作编辑器或属性编辑器中来进行添加快捷键等操作,如下图:

使用 Qt Designer 默认生成的主窗口中不显示工具栏,可以通过单击右键添加工具栏,然后新建一个工具功能 “addWinAction”

如下图:

对应的 MainWin01.py 文件的代码如下:

from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(800, 600) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26)) self.menubar.setObjectName("menubar") self.menu_F = QtWidgets.QMenu(self.menubar) self.menu_F.setObjectName("menu_F") self.menu_E = QtWidgets.QMenu(self.menubar) self.menu_E.setObjectName("menu_E") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.actionopen = QtWidgets.QAction(MainWindow) self.actionopen.setObjectName("actionopen") self.actionnew = QtWidgets.QAction(MainWindow) self.actionnew.setObjectName("actionnew") self.actionclose = QtWidgets.QAction(MainWindow) self.actionclose.setObjectName("actionclose") self.menu_F.addAction(self.actionopen) self.menu_F.addAction(self.actionnew) self.menu_F.addAction(self.actionclose) self.menubar.addAction(self.menu_F.menuAction()) self.menubar.addAction(self.menu_E.menuAction()) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.menu_F.setTitle(_translate("MainWindow", "文件(&F)")) self.menu_E.setTitle(_translate("MainWindow", "编辑(&E)")) self.actionopen.setText(_translate("MainWindow", "open")) self.actionnew.setText(_translate("MainWindow", "new")) self.actionclose.setText(_translate("MainWindow", "close"))

效果测试,添加 CallMainWin01.py 文件,其代码如下:

import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QFileDialog from 初识PyQt5.MainWin01 import Ui_MainWindow class MyMainWin(QMainWindow, Ui_MainWindow): def __init__(self, parent=None): super(MyMainWin, self).__init__(parent) self.setupUi(self) # 菜单的点击事件,当点击关闭菜单时连接槽函数 close() self.fileCloseAction.triggered.connect(self.close) # 当点击打开菜单时连接槽函数 openMsg() self.fileOpenAction.triggered.connect(self.openMsg) def openMsg(self): file, ok = QFileDialog.getOpenFileName(self, "打开", "D:/", "All Files (*);;Text Files (*.txt)") # 在状态栏显示文件夹地址 self.statusbar.showMessage(file) if __name__ == "__main__": app = QApplication(sys.argv) win = MyMainWin() win.show() sys.exit(app.exec_())

运行效果如下图:

二、加载其他窗口

实现在当前窗口嵌入另一个窗口。

1、新建普通窗口

首先使用 Qt Designer 新建一个普通窗口,命名为“ChildrenFrom2”,并在 ChildrenForm 中放置一个 TextEdit 控件。创建一个主窗体,命名为 MainForm2.ui,并在中央添加一个栅格布局管理器,并命名为 “MaingridLayout”。首先是 ChildrenFrom2.ui 对应的 ChildrenFrom2.py 文件的代码如下:# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'childrenForm2.ui' # # Created by: PyQt5 UI code generator 5.11.3 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_ChildrenForm2(object): def setupUi(self, ChildrenForm2): ChildrenForm2.setObjectName("ChildrenForm2") ChildrenForm2.resize(440, 345) self.textEdit = QtWidgets.QTextEdit(ChildrenForm2) self.textEdit.setGeometry(QtCore.QRect(10, 10, 421, 331)) self.textEdit.setObjectName("textEdit") self.retranslateUi(ChildrenForm2) QtCore.QMetaObject.connectSlotsByName(ChildrenForm2) def retranslateUi(self, ChildrenForm2): _translate = QtCore.QCoreApplication.translate ChildrenForm2.setWindowTitle(_translate("ChildrenForm2", "Dialog")) self.textEdit.setPlaceholderText(_translate("ChildrenForm2", "我是子窗口的内容")) MainForm2.ui 对应的 MainForm2.py 文件,其代码如下:# -*- coding: utf-8 -*- from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWin02(object): def setupUi(self, MainWin02): MainWin02.setObjectName("MainWin02") MainWin02.resize(800, 600) self.centralwidget = QtWidgets.QWidget(MainWin02) self.centralwidget.setObjectName("centralwidget") self.gridLayoutWidget = QtWidgets.QWidget(self.centralwidget) self.gridLayoutWidget.setGeometry(QtCore.QRect(0, 0, 721, 491)) self.gridLayoutWidget.setObjectName("gridLayoutWidget") self.MaingridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget) self.MaingridLayout.setContentsMargins(0, 0, 0, 0) self.MaingridLayout.setObjectName("MaingridLayout") MainWin02.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWin02) self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26)) self.menubar.setObjectName("menubar") self.menu_F = QtWidgets.QMenu(self.menubar) self.menu_F.setObjectName("menu_F") self.menu_E = QtWidgets.QMenu(self.menubar) self.menu_E.setObjectName("menu_E") MainWin02.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWin02) self.statusbar.setObjectName("statusbar") MainWin02.setStatusBar(self.statusbar) self.toolBar = QtWidgets.QToolBar(MainWin02) self.toolBar.setObjectName("toolBar") MainWin02.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar) self.fileOpenAction = QtWidgets.QAction(MainWin02) self.fileOpenAction.setObjectName("fileOpenAction") self.fileNewAction = QtWidgets.QAction(MainWin02) self.fileNewAction.setObjectName("fileNewAction") self.fileCloseAction = QtWidgets.QAction(MainWin02) self.fileCloseAction.setObjectName("fileCloseAction") self.addWinAction = QtWidgets.QAction(MainWin02) self.addWinAction.setObjectName("addWinAction") self.menu_F.addAction(self.fileOpenAction) self.menu_F.addAction(self.fileNewAction) self.menu_F.addAction(self.fileCloseAction) self.menubar.addAction(self.menu_F.menuAction()) self.menubar.addAction(self.menu_E.menuAction()) self.toolBar.addSeparator() self.toolBar.addAction(self.addWinAction) self.retranslateUi(MainWin02) QtCore.QMetaObject.connectSlotsByName(MainWin02) def retranslateUi(self, MainWin02): _translate = QtCore.QCoreApplication.translate MainWin02.setWindowTitle(_translate("MainWin02", "MainWindow")) self.menu_F.setTitle(_translate("MainWin02", "文件(&F)")) self.menu_E.setTitle(_translate("MainWin02", "编辑(&E)")) self.toolBar.setWindowTitle(_translate("MainWin02", "toolBar")) self.fileOpenAction.setText(_translate("MainWin02", "打开")) self.fileOpenAction.setShortcut(_translate("MainWin02", "Alt+O")) self.fileNewAction.setText(_translate("MainWin02", "新建")) self.fileNewAction.setToolTip(_translate("MainWin02", "新建")) self.fileNewAction.setShortcut(_translate("MainWin02", "Alt+N")) self.fileCloseAction.setText(_translate("MainWin02", "关闭")) self.fileCloseAction.setToolTip(_translate("MainWin02", "关闭")) self.fileCloseAction.setShortcut(_translate("MainWin02", "Alt+C")) self.addWinAction.setText(_translate("MainWin02", "添加窗体")) self.addWinAction.setToolTip(_translate("MainWin02", "添加窗体")) 在同一个目录下,新建 CallMainWin02.py,其代码如下:# -*- coding:utf-8 -*- # Time : 2019/07/24 下午 7:45 # Author : 御承扬 # e-mail:2923616405@qq.com # project: PyQt5 # File : CallMainWin02.py # @software: PyCharm import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QFileDialog from 菜单栏和工具栏.childrenForm2 import Ui_ChildrenForm2 from 菜单栏和工具栏.MainForm02 import Ui_MainWin02 class MainForm(QMainWindow, Ui_MainWin02): def __init__(self): super(MainForm, self).__init__() self.setupUi(self) # self.child = children()生成子窗口实例self.child self.child = ChildrenForm() # 菜单的点击事件,当点击关闭菜单时连接槽函数 close() self.fileCloseAction.triggered.connect(self.close) # 当点击打开菜单时连接槽函数 openMsg() self.fileOpenAction.triggered.connect(self.openMsg) # 单击添加窗体,子窗口会显示在主窗口的 MaingridLayout 中 self.addWinAction.triggered.connect(self.childShow) # 添加子窗口 def childShow(self): self.MaingridLayout.addWidget(self.child) self.child.show() def openMsg(self): file, ok = QFileDialog.getOpenFileName(self, "打开", "D:/", "All Files (*);;Text Files (*.txt)") # 在状态栏显示文件夹地址 self.statusbar.showMessage(file) class ChildrenForm(QWidget, Ui_ChildrenForm2): def __init__(self): super(ChildrenForm, self).__init__() self.setupUi(self) if __name__ == "__main__": app = QApplication(sys.argv) win = MainForm() win.show() sys.exit(app.exec_()) 运行效果如下图:

最新回复(0)