《PyQt5快速开发与实践》笔记
一、界面设计
使用Qtdesigner设计包含菜单栏和工具栏的界面。
小知识:
1.菜单栏中,对于一级菜单,可以通过输入**“文件(&F)”和“编辑(&E)”来加入快捷键
2.子菜单可以通过在动作编辑器**中添加快捷键、图标等
3.默认无工具栏,工具栏通过鼠标右击添加
4.工具栏中图标的添加方式:在动作编辑器中新建一个Action,并修改图标等信息,将其拖入工具栏
文中示例设置了四个动作:
二、在主窗口中加载其他子窗口
应用场景:在主界面中显示新的子界面
原理:将子窗口实例作为主窗口中的一个元素,在特定条件下通过调用addWeidget方法添加到Layout中,再通过show()方法显示该窗口即可。
-- coding: utf-8 --
Form implementation generated from reading ui file ‘MainForm2.ui’
Created by: PyQt5 UI code generator 5.6
WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(“MainWindow”)
MainWindow.resize(391, 500)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName(“centralwidget”)
self.gridLayoutWidget = QtWidgets.QWidget(self.centralwidget)
self.gridLayoutWidget.setGeometry(QtCore.QRect(-1, -1, 611, 441))
self.gridLayoutWidget.setObjectName(“gridLayoutWidget”)
self.MaingridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
self.MaingridLayout.setContentsMargins(0, 0, 0, 0)
self.MaingridLayout.setObjectName(“MaingridLayout”)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 391, 23))
self.menubar.setObjectName(“menubar”)
self.menu = QtWidgets.QMenu(self.menubar)
self.menu.setObjectName(“menu”)
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.toolBar = QtWidgets.QToolBar(MainWindow)
self.toolBar.setObjectName(“toolBar”)
MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
self.fileOpenAction = QtWidgets.QAction(MainWindow)
self.fileOpenAction.setObjectName(“fileOpenAction”)
self.fileNewAction = QtWidgets.QAction(MainWindow)
self.fileNewAction.setObjectName(“fileNewAction”)
self.fileCloseAction = QtWidgets.QAction(MainWindow)
self.fileCloseAction.setObjectName(“fileCloseAction”)
self.addWinAction = QtWidgets.QAction(MainWindow)
self.addWinAction.setObjectName(“addWinAction”)
self.menu.addAction(self.fileOpenAction)
self.menu.addAction(self.fileNewAction)
self.menu.addAction(self.fileCloseAction)
self.menubar.addAction(self.menu.menuAction())
self.menubar.addAction(self.menu_E.menuAction())
self.toolBar.addAction(self.addWinAction)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.menu.setTitle(_translate("MainWindow", "文件(&F)"))
self.menu_E.setTitle(_translate("MainWindow", "编辑(&E)"))
self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar"))
self.fileOpenAction.setText(_translate("MainWindow", "打开"))
self.fileOpenAction.setShortcut(_translate("MainWindow", "Alt+O"))
self.fileNewAction.setText(_translate("MainWindow", "新建"))
self.fileNewAction.setShortcut(_translate("MainWindow", "Alt+N"))
self.fileCloseAction.setText(_translate("MainWindow", "关闭"))
self.fileCloseAction.setShortcut(_translate("MainWindow", "Alt+C"))
self.addWinAction.setText(_translate("MainWindow", "添加窗体"))
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'MainForm2.ui'
#
# Created by: PyQt5 UI code generator 5.6
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(391, 500)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayoutWidget = QtWidgets.QWidget(self.centralwidget)
self.gridLayoutWidget.setGeometry(QtCore.QRect(-1, -1, 611, 441))
self.gridLayoutWidget.setObjectName("gridLayoutWidget")
self.MaingridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
self.MaingridLayout.setContentsMargins(0, 0, 0, 0)
self.MaingridLayout.setObjectName("MaingridLayout")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 391, 23))
self.menubar.setObjectName("menubar")
self.menu = QtWidgets.QMenu(self.menubar)
self.menu.setObjectName("menu")
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.toolBar = QtWidgets.QToolBar(MainWindow)
self.toolBar.setObjectName("toolBar")
MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
self.fileOpenAction = QtWidgets.QAction(MainWindow)
self.fileOpenAction.setObjectName("fileOpenAction")
self.fileNewAction = QtWidgets.QAction(MainWindow)
self.fileNewAction.setObjectName("fileNewAction")
self.fileCloseAction = QtWidgets.QAction(MainWindow)
self.fileCloseAction.setObjectName("fileCloseAction")
self.addWinAction = QtWidgets.QAction(MainWindow)
self.addWinAction.setObjectName("addWinAction")
self.menu.addAction(self.fileOpenAction)
self.menu.addAction(self.fileNewAction)
self.menu.addAction(self.fileCloseAction)
self.menubar.addAction(self.menu.menuAction())
self.menubar.addAction(self.menu_E.menuAction())
self.toolBar.addAction(self.addWinAction)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.menu.setTitle(_translate("MainWindow", "文件(&F)"))
self.menu_E.setTitle(_translate("MainWindow", "编辑(&E)"))
self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar"))
self.fileOpenAction.setText(_translate("MainWindow", "打开"))
self.fileOpenAction.setShortcut(_translate("MainWindow", "Alt+O"))
self.fileNewAction.setText(_translate("MainWindow", "新建"))
self.fileNewAction.setShortcut(_translate("MainWindow", "Alt+N"))
self.fileCloseAction.setText(_translate("MainWindow", "关闭"))
self.fileCloseAction.setShortcut(_translate("MainWindow", "Alt+C"))
self.addWinAction.setText(_translate("MainWindow", "添加窗体"))
2.子窗口的ui:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ChildrenForm2.ui'
#
# Created by: PyQt5 UI code generator 5.6
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_ChildrenForm(object):
def setupUi(self, ChildrenForm):
ChildrenForm.setObjectName("ChildrenForm")
ChildrenForm.resize(454, 380)
ChildrenForm.setStyleSheet("")
self.textEdit = QtWidgets.QTextEdit(ChildrenForm)
self.textEdit.setGeometry(QtCore.QRect(10, 10, 431, 361))
self.textEdit.setObjectName("textEdit")
self.retranslateUi(ChildrenForm)
QtCore.QMetaObject.connectSlotsByName(ChildrenForm)
def retranslateUi(self, ChildrenForm):
_translate = QtCore.QCoreApplication.translate
ChildrenForm.setWindowTitle(_translate("ChildrenForm", "Form"))
self.textEdit.setHtml(_translate("ChildrenForm", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'SimSun\'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">我是子窗口的内容</p></body></html>"))
3.界面:
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QFileDialog
from MainForm2 import Ui_MainWindow
from ChildrenForm2 import Ui_ChildrenForm
class MainForm(QMainWindow, Ui_MainWindow):
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)
# 点击actionTst,子窗口就会显示在主窗口的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, "打开", "C:/", "All Files (*);;Text Files (*.txt)")
# 在状态栏显示文件地址
self.statusbar.showMessage(file)
class ChildrenForm(QWidget, Ui_ChildrenForm):
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_())