前面我们新建了一个Widget——class MainWidget(QWidget)并令其在屏幕上显示,而QMainWindow可以提供一个主窗口。
在QMainWindow.py可以看见,QMainWindow继承自QWidget,通过QMainWindow你可以添加自己的QToolBars、QDockWidgets、QMenuBar、QStatusBar等。(可以在QMainWindow.py查看该类提供的方法。)
新建main_window.py并编辑代码如下:
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QAction, qApp
class MainWidget(QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.setGeometry(500, 100, 500, 500)
self.setWindowTitle('PyQt5')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MainWidget()
sys.exit(app.exec())
状态栏是用来显示应用的状态信息的组件。
在main_window.py中编辑代码如下:
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QAction, qApp
class MainWidget(QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# statusBar--状态栏
self.statusBar().showMessage('Ready')
self.setGeometry(500, 100, 500, 500)
self.setWindowTitle('PyQt5')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MainWidget()
sys.exit(app.exec())
一个应用程序可以有多个Menu(横向),每个菜单里可以有多个Action(纵向)。
在main_window.py中编辑代码如下:
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QAction, qApp
from PyQt5.QtGui import QIcon
class MainWidget(QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.init_menu()
self.statusBar().showMessage('Ready')
self.setGeometry(500, 100, 500, 500)
self.setWindowTitle('PyQt5')
self.show()
def init_menu(self):
# 命令属性设置
exit_act = QAction(QIcon('exit.png'), '&Exit', self)
exit_act.setShortcut('Ctrl+Q')
exit_act.setStatusTip('Quit PyQt5')
# 点击时触发QApplication的quit()行为退出应用
exit_act.triggered.connect(qApp.quit)
# 新建菜单栏
menu_bar = self.menuBar()
# 新增一个菜单
file_menu = menu_bar.addMenu('&File')
# 在菜单下新增命令
file_menu.addAction(exit_act)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MainWidget()
sys.exit(app.exec())
QAction是菜单栏、工具栏或者快捷键的动作的组合。这里创建了一个终止应用的命令,鼠标悬停在Exit的时候状态栏显示相应的状态提示。
运行效果如图:
子菜单是嵌套在菜单里面的二级或者三级等的菜单。
在main_window.py中编辑代码如下:
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QAction, qApp, QMenu
from PyQt5.QtGui import QIcon
class MainWidget(QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.init_menu()
self.statusBar().showMessage('Ready')
self.setGeometry(500, 100, 500, 500)
self.setWindowTitle('PyQt5')
self.show()
def init_menu(self):
exit_act = QAction(QIcon('exit.png'), '&Exit', self)
exit_act.setShortcut('Ctrl+Q')
exit_act.setStatusTip('Quit PyQt5')
exit_act.triggered.connect(qApp.quit)
new_act = QAction('&New Project...', self)
new_act.setShortcut('Ctrl+N')
new_act.setStatusTip('Create a New Project')
# 二级菜单下命令属性设置
open_file = QAction('&Open File...', self)
open_file.setStatusTip('Open a file in PyQt5')
open_project = QAction('&Open Project...', self)
open_project.setStatusTip('Open a project in PyQt5')
# 新增二级菜单
open_menu = QMenu('&Open...', self)
open_menu.addAction(open_file)
open_menu.addAction(open_project)
menu_bar = self.menuBar()
file_menu = menu_bar.addMenu('&File')
file_menu.addAction(new_act)
# 这里使用了addMenu()
file_menu.addMenu(open_menu)
file_menu.addAction(exit_act)
tool_menu = menu_bar.addMenu('Tools')
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MainWidget()
sys.exit(app.exec())
在界面点击鼠标右键,出现弹出框菜单。
在main_window.py中编辑代码如下:
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QAction, qApp, QMenu
class MainWidget(QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.statusBar().showMessage('Ready')
self.setGeometry(500, 100, 500, 500)
self.setWindowTitle('PyQt5')
self.show()
def contextMenuEvent(self, event):
"""重定义右键函数"""
ri_menu = QMenu(self)
new_act = ri_menu.addAction("New")
opn_act = ri_menu.addAction("Open")
quit_act = ri_menu.addAction("Quit")
# mapToGlobal()方法把当前组件的相对坐标转换为窗口(window)的绝对坐标
# exec_()为QMenu提供的方法,用于显示菜单
action = ri_menu.exec_(self.mapToGlobal(event.pos()))
# 如果右键菜单里触发了退出事件,执行关闭程序行为
if action == quit_act:
qApp.quit()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MainWidget()
sys.exit(app.exec())
菜单栏包含了所有的命令,工具栏是其中常用的命令的集合。
在main_window.py中编辑代码如下:
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QAction, qApp
from PyQt5.QtGui import QIcon
class MainWidget(QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.statusBar().showMessage('Ready')
# 设置工具图标
exit_act = QAction(QIcon('C://exit.png'), 'Exit', self)
exit_act.setShortcut('Ctrl+Q')
exit_act.setStatusTip('Quit PyQt5')
exit_act.triggered.connect(qApp.quit)
self.toolbar = self.addToolBar('Exit')
self.toolbar.addAction(exit_act)
self.setGeometry(500, 100, 500, 500)
self.setWindowTitle('PyQt5')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MainWidget()
sys.exit(app.exec())
将以上所有部件结合起来,编辑代码如下:
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QAction, qApp, QMenu
from PyQt5.QtGui import QIcon
class MainWidget(QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.init_menu()
self.init_tool()
self.statusBar().showMessage('Ready')
self.setGeometry(500, 100, 500, 500)
self.setWindowTitle('PyQt5')
self.show()
def init_menu(self):
exit_act = QAction(QIcon('exit.png'), '&Exit', self)
exit_act.setShortcut('Ctrl+Q')
exit_act.setStatusTip('Quit PyQt5')
exit_act.triggered.connect(qApp.quit)
new_act = QAction(QIcon('new.png'), '&New Project...', self)
new_act.setShortcut('Ctrl+N')
new_act.setStatusTip('Create a New Project')
open_file = QAction('&Open File...', self)
open_file.setStatusTip('Open a file in PyQt5')
open_project = QAction('&Open Project...', self)
open_project.setStatusTip('Open a project in PyQt5')
open_menu = QMenu('&Open...', self)
open_menu.addAction(open_file)
open_menu.addAction(open_project)
menu_bar = self.menuBar()
file_menu = menu_bar.addMenu('&File')
file_menu.addAction(new_act)
file_menu.addMenu(open_menu)
file_menu.addAction(exit_act)
tool_menu = menu_bar.addMenu('Tools')
def init_tool(self):
exit_act = QAction(QIcon('C://exit.png'), 'Exit', self)
exit_act.setShortcut('Ctrl+Q')
exit_act.setStatusTip('Quit PyQt5')
exit_act.triggered.connect(qApp.quit)
self.toolbar = self.addToolBar('Exit')
self.toolbar.addAction(exit_act)
def contextMenuEvent(self, event):
"""重定义右键函数"""
ri_menu = QMenu(self)
new_act = ri_menu.addAction("New")
opn_act = ri_menu.addAction("Open")
quit_act = ri_menu.addAction("Quit")
# mapToGlobal()方法把当前组件的相对坐标转换为窗口(window)的绝对坐标
# exec_()为QMenu提供的方法,用于显示菜单
action = ri_menu.exec_(self.mapToGlobal(event.pos()))
# 如果右键菜单里触发了退出事件,执行关闭程序行为
if action == quit_act:
qApp.quit()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MainWidget()
sys.exit(app.exec())