PySide6 Win10记事本从零到一——第七章 格式菜单界面与功能实现
文章目录
- 第七章 格式菜单界面与功能实现
- 7.1 界面分析
- 7.1.1 实现代码
- 7.2 功能分析
- 7.2.1 自动换行实现
- 7.2.2 设置字体
- 7.3 效果演示
第七章 格式菜单界面与功能实现
这一章我们会实现格式菜单的菜单项界面 以及所以功能
7.1 界面分析

- 自动换行(&W): 可以被勾选而且默认被勾选
- 字体(&F):打开字体对话框
7.1.1 实现代码
custom_menu.py,这里只提供实现格式菜单的代码
from PySide6.QtWidgets import QMenuclass FormatMenu(QMenu):"""格式菜单:param QMenu: PySide6 菜单类"""def __init__(self):"""初始化"""super().__init__()self.setup_ui()def setup_ui(self):"""设置菜单项"""# 设置菜单标题self.setTitle("格式(&O)")# 添加自动换行 和 字体 行为line_warp = self.addAction("自动换行(&W)")font_dialog = self.addAction("字体(&F)")# 设置自动换行 可勾选 且 默认勾选line_warp.setCheckable(True)line_warp.setChecked(True)
注意:
QAction.setCheckable(True)用于设置行为可勾选,QAction.setChecked(True)设置行为默认勾选。
notepad_main.py
from PySide6.QtWidgets import QMainWindow,QPlainTextEdit,QFrame,QApplication
from custom_menu import FormatMenu
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()# 实例化文件、编辑、格式、查看、帮助菜单file_menu = FileMenu()edit_menu = EditMenu()format_menu = FormatMenu()# 添加其他自定义的菜单self.__menubar.addMenu(file_menu)self.__menubar.addMenu(edit_menu)self.__menubar.addMenu(format_menu)# 示例化纯文本编辑 plain_text_edit = QPlainTextEdit()# 消除框线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())
7.2 功能分析
- 自动换行(&W): 勾选时,换行类型为 自动换行;不勾选时,换行类型为 手动换行;
- 字体(&F): 触发行为时: 打开字体对话框,选择字体并 修改纯文本编辑的文本
重点:
- 触发自动换行行为的信号,连接设置换行模式(槽函数)
- 触发字体行为的信号,连接设置字体对话框(槽函数)
注意:
- 勾选自动换行时(默认状态),纯文本编辑器(
QPlainTextEdit)的水平滚动条策略(horizontalScrollBarPolicy)设为“按需显示”。- 取消勾选自动换行时,纯文本编辑器(
QPlainTextEdit)的水平滚动条策略(horizontalScrollBarPolicy)设为“始终显示”。
描述继承关系 ,然后 链接相关代码
小技巧:
QAction的triggered信号会携带一个布尔值,表示该动作是否被触发。结合条件分支语句,即可根据这一布尔值在两种状态下实现不同的效果。
7.2.1 自动换行实现
由于上一章我们已经自定义了一个纯文本编辑器,为了更好地划分代码职责、便于后续的代码整合,这里也自定义一个纯文本编辑器,并且在里面实现自动换行的槽函数。
custom_plain_text_edit.py 自定义纯文本编辑
from PySide6.QtWidgets import QPlainTextEditclass PlainTextEdit(QPlainTextEdit):"""纯文本编辑:param QPlainTextEdit: PySide6 QPlainTextEdit"""def __init__(self):"""初始化"""super().__init__()def set_line_warp_mode(self,triggered = True):"""设置换行模式"""if triggered:self.setLineWrapMode(self.LineWrapMode.WidgetWidth)else:self.setLineWrapMode(self.LineWrapMode.NoWrap)
custom_menu.py 格式菜单
from PySide6.QtWidgets import QMenu
from custom_plain_text_edit import PlainTextEditclass FormatMenu(QMenu):"""格式菜单:param QMenu: PySide6 菜单类"""def __init__(self):"""初始化"""super().__init__()self.setup_ui()def setup_ui(self):"""设置菜单项"""# 设置菜单标题self.setTitle("格式(&O)")# 添加自动换行 和 字体 行为self.__line_warp = self.addAction("自动换行(&W)")self.__font_dialog = self.addAction("字体(&F)")# 设置自动换行 可勾选 且 默认勾选self.__line_warp.setCheckable(True)self.__line_warp.setChecked(True)def set_event_bind(self,plain_text_edit: PlainTextEdit):"""设置事件绑定"""self.__line_warp.triggered.connect(plain_text_edit.set_line_warp_mode)
notepad_main.py 记事本主界面
from PySide6.QtWidgets import QMainWindow,QFrame,QApplication
from custom_menu import FormatMenu
from custom_plain_text_edit import PlainTextEdit
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()# 实例化文件、编辑、格式、查看、帮助菜单file_menu = FileMenu()edit_menu = EditMenu()self.__format_menu = FormatMenu()# 添加其他自定义的菜单self.__menubar.addMenu(file_menu)self.__menubar.addMenu(edit_menu)self.__menubar.addMenu(self.__format_menu)# 示例化纯文本编辑 self.__plain_text_edit = PlainTextEdit()# 消除框线self.__plain_text_edit.setFrameShape(QFrame.Shape.NoFrame)# 添加纯文本编辑到 中心窗口self.setCentralWidget(self.__plain_text_edit)# 添加状态栏目self.statusBar()def setup_event_bind(self):"""设置事件绑定"""self.__format_menu.set_event_bind(self.__plain_text_edit)if __name__ == "__main__":app = QApplication(sys.argv)# 添加其他菜单notepad_main = NotepadMain()notepad_main.show()sys.exit(app.exec())
7.2.2 设置字体
首先我们来看一个简单的打开字体对话框,并返回字体的方法。
ok,font = QFontDialog.getFont()if ok:plain_text_edit.setFont(font)
这里使用了QFontDialog字体对话框,然后使用文本编辑 设置获取到的字体。
下边是完整功能的代码:
notepad_main.py 使用7.2.1的代码即可
custom_menu.py 修改如下
- 添加设置字体方法
def set_font(self,plain_text_edit: PlainTextEdit):"""显示字体对话框 然后设置字体"""ok,font = QFontDialog.getFont()if ok:plain_text_edit.setFont(font)
- 添加事件绑定
self.__font_dialog.triggered.connect(lambda: self.set_font(plain_text_edit))
7.3 效果演示
等待更新
