菜单栏和工具栏
一、界面设计
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
)
self
.fileCloseAction
.triggered
.connect
(self
.close
)
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 文件的代码如下:
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 文件,其代码如下:
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,其代码如下:
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
= ChildrenForm
()
self
.fileCloseAction
.triggered
.connect
(self
.close
)
self
.fileOpenAction
.triggered
.connect
(self
.openMsg
)
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_
())
运行效果如下图: