PySide6 Win10记事本从零到一——第八章 查看菜单界面与功能实现
第八章 查看菜单界面与功能实现
在这一章我们将实现win10记事本菜单栏里的查看 菜单界面与功能。
我们将会学习如下知识:
- 在菜单中添加子菜单
- 在子菜单中添加行为
- 显示与隐藏状态栏
- 增大与缩小纯文本里的字体
8.1 界面分析

8.1.1 菜单项
在图示菜单项中包含如下元素:
- 缩放(Z) 子菜单
- 状态栏(S) 显示
缩放子菜单:
- 放大
- 缩小
- 恢复默认缩放
8.2 界面实现
主要包含俩个文件:
view_menu.py: 查看菜单notepad_main.py:记事本主窗口
notepad_main.py
from PySide6.QtWidgets import QMainWindow,QFrame,QPlainTextEdit,QApplication
from custom_menu import ViewMenu
import sysclass NotepadMain(QMainWindow):"""记事本主界面:param QMainWindow: 主窗口"""def __init__(self):"""初始化"""super().__init__()self.setup_ui()def setup_ui(self):"""设置用户界面"""# 设置窗口标题self.setWindowTitle("无标题 - 记事本")# 设置窗口大小self.resize(800, 500)# 创建菜单栏 设置为私有属性self.__menubar = self.menuBar()# 实例化查看菜单self.__view_menu = ViewMenu()# 添加其他自定义的菜单self.__menubar.addMenu(self.__view_menu)# 示例化纯文本编辑 self.__plain_text_edit = QPlainTextEdit()# 消除框线self.__plain_text_edit.setFrameShape(QFrame.Shape.NoFrame)# 添加纯文本编辑到 中心窗口self.setCentralWidget(self.__plain_text_edit)# 添加状态栏目self.statusBar()if __name__ == "__main__":app = QApplication(sys.argv)# 添加其他菜单notepad_main = NotepadMain()notepad_main.show()sys.exit(app.exec())
view_menu.py
from PySide6.QtWidgets import QMenu
from PySide6.QtGui import QKeySequenceclass ViewMenu(QMenu):"""查看菜单:param QMenu: PySide6 菜单类"""def __init__(self):"""初始化"""super().__init__()self.setup_ui()def setup_ui(self):"""设置界面"""# 设置标题 self.setTitle("查看")# 添加 缩放子菜单 和行为zoom_menu = self.addMenu("缩放(&Z)")status_bar = self.addAction("状态栏(&S)")# 子菜单添加行为zoom_menu.addAction("放大(&I)",QKeySequence.StandardKey.ZoomIn)zoom_menu.addAction("放缩小(&O)",QKeySequence.StandardKey.ZoomOut)# 状态栏行为 可勾选且 默认为勾选状态status_bar.setCheckable(True)status_bar.setChecked(True)
8.3 功能实现
将会实现如下功能,并涉及原理:
如下功能:
- 放大 QPlainTextEdit.zoomIn()
- 缩小 QPlainTextEdit.zoomOut() 重构
- 恢复默认字体大小 => 重新设置字体 可能会解决
notepad_main.py
from PySide6.QtWidgets import QMenu
from PySide6.QtGui import QKeySequence
from custom_plain_text_edit import PlainTextEditclass ViewMenu(QMenu):"""查看菜单:param QMenu: PySide6 菜单类"""def __init__(self):"""初始化"""super().__init__()self.setup_ui()def setup_ui(self):"""设置界面"""# 设置标题 self.setTitle("查看")# 添加 缩放子菜单 和行为zoom_menu = self.addMenu("缩放(&Z)")self.status_bar_action = self.addAction("状态栏(&S)")# 子菜单添加行为self.zoom_in_action = zoom_menu.addAction("放大(&I)",QKeySequence.StandardKey.ZoomIn)self.zoom_out_action = zoom_menu.addAction("放缩小(&O)",QKeySequence.StandardKey.ZoomOut)self.zoom_default_action = zoom_menu.addAction("恢复默认缩放","Ctrl+0")# 状态栏行为 可勾选且 默认为勾选状态self.status_bar_action.setCheckable(True)self.status_bar_action.setChecked(True)
notepad_main.py
from PySide6.QtWidgets import QMainWindow,QFrame,QApplication
from custom_plain_text_edit import PlainTextEdit
from view_menu import ViewMenu
import sysclass NotepadMain(QMainWindow):"""记事本主界面:param QMainWindow: 主窗口"""def __init__(self): """初始化"""super().__init__()self.setup_ui()self.setup_event_bind()def setup_ui(self):"""设置用户界面"""# 设置窗口标题self.setWindowTitle("无标题 - 记事本")# 设置窗口大小self.resize(800, 500)# 创建菜单栏 设置为私有属性self.__menubar = self.menuBar()# 实例化查看菜单self.__view_menu = ViewMenu()# 添加其他自定义的菜单self.__menubar.addMenu(self.__view_menu)# 示例化纯文本编辑 self.__plain_text_edit = PlainTextEdit()# 消除框线self.__plain_text_edit.setFrameShape(QFrame.Shape.NoFrame)# 添加纯文本编辑到 中心窗口self.setCentralWidget(self.__plain_text_edit)# 添加状态栏目self.status_bar = self.statusBar()def setup_event_bind(self):"""设置事件绑定"""self.__view_menu.zoom_in_action.triggered.connect(self.__plain_text_edit.zoomIn)self.__view_menu.zoom_out_action.triggered.connect(self.__plain_text_edit.zoomOut)self.__view_menu.zoom_default_action.triggered.connect(self.__plain_text_edit.set_default_font_size)self.__view_menu.status_bar_action.triggered.connect(self.show_hide_status_bar)def show_hide_status_bar(self,bool):"""显示或者隐藏状态栏"""self.status_bar.show() if bool else self.status_bar.hide()if __name__ == "__main__":app = QApplication(sys.argv)# 添加其他菜单notepad_main = NotepadMain()notepad_main.show()sys.exit(app.exec())
custom_plain_text_edit.py
from PySide6.QtWidgets import QPlainTextEdit
from PySide6.QtCore import Signal,QDateTimeclass PlainTextEdit(QPlainTextEdit):"""纯文本编辑:param QPlainTextEdit: PySide6 QPlainTextEdit"""hasText = Signal(bool)def __init__(self):"""初始化"""super().__init__()def zoomOut(self, bool,range=1):"""缩小方法:param bool: 行为触发状态:return: 如果小于11 不缩小 其他缩小"""if self.font().pointSize() <= 11 :range = 0return super().zoomOut(range)else:return super().zoomOut(range)def set_default_font_size(self,bool):"""设置默认字体大小"""if not bool: