文章目录
前言
在PyQt5桌面应用开发中,记事本是入门级经典案例,其核心围绕QMainWindow展开,还涉及文件操作、界面交互、文本处理等多类关键组件。本文将结合思维导图结构,系统梳理《基于QMainWindow实现记事本-水印.pdf》中的核心知识点,从基础概念到实战逻辑,帮助开发者快速掌握记事本开发的完整流程。
思维导图

一、基础认知:QMainWindow与QWidget的核心差异
要开发基于QMainWindow的记事本,首先需明确QMainWindow与QWidget的定位区别——二者是PyQt5界面体系的“基石”,但功能侧重完全不同。
1. 继承关系与定位
- QWidget:是QT中所有与用户交互类的“基类”,小到
QPushButton按钮,大到QMainWindow主窗口,均直接或间接继承自QWidget,是界面组件的“最小单元”。 - QMainWindow:继承自
QWidget,是专门为“完整应用主窗口”设计的类,在基础窗口功能上做了扩展,无需开发者从零搭建复杂界面框架。
2. 功能对比
| 特性 | QWidget | QMainWindow |
|---|---|---|
| 核心功能 | 仅提供基础窗口能力(大小调整、移动、关闭) | 新增菜单栏、工具栏、状态栏、中心部件、停靠窗口 |
| 适用场景 | 简单控件(弹窗、子窗口)、自定义组件 | 完整应用主窗口(记事本、编辑器、浏览器) |
| 开发成本 | 需手动添加所有交互组件 | 自带标准化框架,可直接复用 |
3. 关键结论
开发记事本这类带“菜单-工具-状态栏”的应用时,优先使用QMainWindow,能大幅减少界面搭建代码,聚焦业务逻辑实现。
二、记事本:功能清单与实现思路
记事本的核心是“文本处理+文件管理”,功能设计需贴合用户日常使用习惯,实现思路则需分“界面搭建”和“业务绑定”两步走。
1. 核心功能清单
记事本需覆盖以下基础功能,确保实用性和完整性:
- 文件操作:新建、打开、保存、另存为(核心需求,解决文本的“存-取”问题)
- 文本编辑:复制、粘贴、剪切、撤销、恢复(提升编辑效率,符合用户操作直觉)
- 格式设置:字体选择(类型、大小、样式)、颜色设置(文本色、背景色)(满足个性化需求)
- 界面交互:菜单栏点击响应、工具栏快捷操作、状态栏状态提示(优化用户体验)
2. 实现思路拆解
(1)界面设计
界面是用户与功能交互的入口,需按以下步骤构建标准化窗口:
- 基础设置:给窗口添加图标(提升辨识度)、设置初始标题(默认“无标题-记事本”);
- 核心组件:添加菜单栏(承载“文件”“编辑”“格式”等菜单)、工具栏(放常用快捷按钮,如“保存”“字体”)、状态栏(显示操作提示,如“准备就绪”);
- 内容区域:在窗口中心添加
QTextEdit文本编辑区(记事本的“核心工作区”,支持多行文本输入); - 菜单细化:给菜单栏的每个菜单添加“动作”(如“文件”菜单下的“新建”“打开”选项),动作需关联文本和图标(可选)。
(2)业务实现
界面搭建完成后,需通过“信号与槽”机制,让菜单/工具栏的“动作”触发具体业务逻辑:
- 核心原理:每个“动作”(如“保存”按钮)都有
triggered()信号,将该信号与自定义的“槽函数”(如save_file())绑定,点击动作时自动执行槽函数; - 关键问题:如何判断文本是否被修改?
QTextEdit提供textChanged()信号,文本变化时触发该信号,可在槽函数中更新窗口标题(如添加“*”标记,提示用户“内容未保存”)。
三、核心业务逻辑:从“动作”到“功能”的落地
记事本的业务逻辑集中在“文件操作”和“文本编辑”,其中“文件操作”(新建、打开、保存)需处理用户的“修改提示”,避免内容丢失,是实现难点。
1. 新建文件:处理“未保存内容”
新建文件前,需先判断当前文本是否已修改,避免用户误操作导致内容丢失,流程如下:
def new_file(self):
# 1. 判断文本是否已修改(窗口标题含“*”表示修改未保存)
if "*" in self.windowTitle():
# 弹出提示框,让用户选择“保存”“不保存”“取消”
from PyQt5.QtWidgets import QMessageBox
reply = QMessageBox.question(
self, "提示", "当前内容已修改,是否保存?",
QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel
)
# 按用户选择执行操作
if reply == QMessageBox.Save:
self.save_file() # 保存当前内容
elif reply == QMessageBox.Cancel:
return # 取消新建,不做任何操作
# 2. 清空文本区,重置窗口标题
self.text_edit.clear()
self.setWindowTitle("无标题-记事本")
2. 打开文件:先处理“旧内容”,再加载“新内容”
打开文件的核心是“读取外部文件内容并显示到文本区”,但需先处理当前未保存的文本,流程与“新建文件”类似:
def open_file(self):
# 1. 先处理当前未保存的文本(同新建文件逻辑)
if "*" in self.windowTitle():
# 弹窗提示保存,代码省略(参考new_file函数)
...
# 2. 弹出文件选择对话框,让用户选要打开的文件
from PyQt5.QtWidgets import QFileDialog
file_path, _ = QFileDialog.getOpenFileName(
self, "打开文件", "./", "文本文件 (*.txt);;所有文件 (*)"
)
if not file_path:
return # 用户取消选择,直接返回
# 3. 读取文件内容并显示到文本区
from PyQt5.QtCore import QFile
file = QFile(file_path)
if file.open(QFile.ReadOnly | QFile.Text):
# 读取全部内容并转换为字符串(避免中文乱码)
content = file.readAll().data().decode("utf-8")
self.text_edit.setText(content)
file.close()
# 4. 更新窗口标题(显示当前打开的文件名)
from PyQt5.QtCore import QFileInfo
file_info = QFileInfo(file_path)
self.setWindowTitle(f"{file_info.fileName()}-记事本")
3. 保存/另存为:区分“已命名”与“未命名”文件
保存文件的核心是“判断文件是否已命名”——未命名文件需触发“另存为”,已命名文件直接覆盖原内容:
(1)保存文件(save_file)
def save_file(self):
# 1. 未命名文件(标题为“无标题-记事本”),触发“另存为”
if self.windowTitle() == "无标题-记事本":
self.save_as_file()
return
# 2. 已命名文件,直接覆盖原内容
# 从窗口标题中提取文件名(如“test.txt-记事本”→“test.txt”)
file_name = self.windowTitle().replace("-记事本", "")
file = QFile(file_name)
if file.open(QFile.WriteOnly | QFile.Text):
# 读取文本区内容并写入文件(需编码为bytes)
content = self.text_edit.toPlainText().encode("utf-8")
file.write(content)
file.close()
# 重置窗口标题(移除“*”,表示内容已保存)
self.setWindowTitle(f"{file_name}-记事本")
(2)另存为文件(save_as_file)
def save_as_file(self):
# 弹出“另存为”对话框,让用户选择保存路径和文件名
file_path, _ = QFileDialog.getSaveFileName(
self, "另存为", "./未命名.txt", "文本文件 (*.txt);;所有文件 (*)"
)
if not file_path:
return
# 写入文件(逻辑同save_file,代码省略)
...
# 更新窗口标题为新文件名
file_info = QFileInfo(file_path)
self.setWindowTitle(f"{file_info.fileName()}-记事本")
4. 文本编辑:直接复用QTextEdit自带功能
复制、粘贴、剪切、撤销、恢复等操作,QTextEdit已内置对应槽函数,无需手动实现,只需将“动作”与函数绑定即可:
# 复制动作绑定QTextEdit的copy()函数
self.copy_action.triggered.connect(self.text_edit.copy)
# 粘贴动作绑定QTextEdit的paste()函数
self.paste_action.triggered.connect(self.text_edit.paste)
# 剪切、撤销、恢复同理
self.cut_action.triggered.connect(self.text_edit.cut)
self.undo_action.triggered.connect(self.text_edit.undo)
self.redo_action.triggered.connect(self.text_edit.redo)
5.代码整合
用刚刚所学的内容整合起来,可以得到以下内容:
import sys
from PyQt5.QtCore import Qt, QFile, QFileInfo, QIODevice
from PyQt5.QtGui import QIcon, QFont, QColor, QKeySequence
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTextEdit, QMenuBar,
QMenu, QAction, QToolBar, QStatusBar, QFileDialog,
QFontDialog, QColorDialog, QMessageBox)
class Notepad(QMainWindow):
def __init__(self):
super().__init__()
# 初始化窗口基础设置
self.init_window()
# 初始化界面组件(菜单、工具、文本区等)
self.init_ui()
# 初始化信号与槽绑定
self.bind_signals()
def init_window(self):
"""初始化窗口:标题、图标、大小、位置"""
self.setWindowTitle("无标题-记事本")
# 设置窗口图标(需替换为本地图标路径,若无需图标可注释)
self.setWindowIcon(QIcon("notepad_icon.png"))
# 设置窗口初始大小与位置(800x600,屏幕居中)
self.resize(800, 600)
screen_geo = QApplication.desktop().availableGeometry()
self.move((screen_geo.width() - self.width()) // 2,
(screen_geo.height() - self.height()) // 2)
def init_ui(self):
"""初始化界面组件:文本区、菜单、工具栏、状态栏"""
# 1. 中心文本编辑区(QTextEdit)
self.text_edit = QTextEdit(self)
self.setCentralWidget(self.text_edit)
# 设置默认字体(微软雅黑,12号)
default_font = QFont("微软雅黑", 12)
self.text_edit.setFont(default_font)
# 2. 菜单栏(QMenuBar)
self.menu_bar = self.menuBar()
# 创建“文件”“编辑”“格式”菜单
self.file_menu = self.menu_bar.addMenu("文件(&F)")
self.edit_menu = self.menu_bar.addMenu("编辑(&E)")
self.format_menu = self.menu_bar.addMenu("格式(&O)")
# 2.1 “文件”菜单动作(QAction)
self.new_action = QAction(QIcon("new_icon.png"), "新建(&N)", self)
self.open_action = QAction(QIcon("open_icon.png"), "打开(&O)", self)
self.save_action = QAction(QIcon("save_icon.png"), "保存(&S)", self)
self.save_as_action = QAction("另存为(&A)", self)
self.exit_action = QAction("退出(&X)", self)
# 添加动作到“文件”菜单,加分隔线
self.file_menu.addAction(self.new_action)
self.file_menu.addAction(self.open_action)
self.file_menu.addAction(self.save_action)
self.file_menu.addAction(self.save_as_action)
self.file_menu.addSeparator()
self.file_menu.addAction(self.exit_action)
# 2.2 “编辑”菜单动作
self.undo_action = QAction("撤销(&U)", self)
self.redo_action = QAction("恢复(&R)", self)
self.cut_action = QAction("剪切(&T)", self)
self.copy_action = QAction("复制(&C)", self)
self.paste_action = QAction("粘贴(&V)", self)
# 添加动作到“编辑”菜单,加分隔线
self.edit_menu.addAction(self.undo_action)
self.edit_menu.addAction(self.redo_action)
self.edit_menu.addSeparator()
self.edit_menu.addAction(self.cut_action)
self.edit_menu.addAction(self.copy_action)
self.edit_menu.addAction(self.paste_action)
# 2.3 “格式”菜单动作
self.font_action = QAction("字体(&F)", self)
self.text_color_action = QAction("文本颜色(&C)", self)
self.format_menu.addAction(self.font_action)
self.format_menu.addAction(self.text_color_action)
# 3. 工具栏(QToolBar)
self.tool_bar = self.addToolBar("快捷工具栏")
# 添加常用动作到工具栏(文件操作+文本编辑)
self.tool_bar.addAction(self.new_action)
self.tool_bar.addAction(self.open_action)
self.tool_bar.addAction(self.save_action)
self.tool_bar.addSeparator()
self.tool_bar.addAction(self.cut_action)
self.tool_bar.addAction(self.copy_action)
self.tool_bar.addAction(self.paste_action)
# 设置工具栏按钮样式(图标+文本)
self.tool_bar.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
# 4. 状态栏(QStatusBar)
self.status_bar = self.statusBar()
self.status_bar.showMessage("准备就绪", 3000) # 初始提示3秒后消失
# 5. 设置动作快捷键(QKeySequence)
self.new_action.setShortcut(QKeySequence.New) # Ctrl+N
self.open_action.setShortcut(QKeySequence.Open) # Ctrl+O
self.save_action.setShortcut(QKeySequence.Save) # Ctrl+S
self.exit_action.setShortcut(QKeySequence.Quit) # Ctrl+Q
self.undo_action.setShortcut(QKeySequence.Undo) # Ctrl+Z
self.redo_action.setShortcut(QKeySequence.Redo) # Ctrl+Y
self.cut_action.setShortcut(QKeySequence.Cut) # Ctrl+X
self.copy_action.setShortcut(QKeySequence.Copy) # Ctrl+C
self.paste_action.setShortcut(QKeySequence.Paste)# Ctrl+V
# 6. 设置动作状态栏提示
self.new_action.setStatusTip("新建一个空白文件")
self.open_action.setStatusTip("打开已存在的文本文件")
self.save_action.setStatusTip("保存当前文件内容")
self.save_as_action.setStatusTip("将当前内容另存为新文件")
self.exit_action.setStatusTip("退出记事本应用")
self.undo_action.setStatusTip("撤销上一步操作")
self.redo_action.setStatusTip("恢复上一步撤销的操作")
self.cut_action.setStatusTip("剪切选中的文本到剪贴板")
self.copy_action.setStatusTip("复制选中的文本到剪贴板")
self.paste_action.setStatusTip("粘贴剪贴板内容到当前位置")
self.font_action.setStatusTip("设置文本的字体样式和大小")
self.text_color_action.setStatusTip("设置文本的颜色")
def bind_signals(self):
"""绑定所有动作的信号与槽函数"""
# 1. 文件菜单信号
self.new_action.triggered.connect(self.new_file)
self.open_action.triggered.connect(self.open_file)
self.save_action.triggered.connect(self.save_file)
self.save_as_action.triggered.connect(self.save_as_file)
self.exit_action.triggered.connect(self.close) # 直接调用窗口关闭方法
# 2. 编辑菜单信号(绑定QTextEdit自带槽函数)
self.undo_action.triggered.connect(self.text_edit.undo)
self.redo_action.triggered.connect(self.text_edit.redo)
self.cut_action.triggered.connect(self.text_edit.cut)
self.copy_action.triggered.connect(self.text_edit.copy)
self.paste_action.triggered.connect(self.text_edit.paste)
# 3. 格式菜单信号
self.font_action.triggered.connect(self.set_font)
self.text_color_action.triggered.connect(self.set_text_color)
# 4. 文本编辑区信号(文本变化时更新窗口标题)
self.text_edit.textChanged.connect(self.on_text_changed)
def new_file(self):
"""新建文件:处理未保存内容提示"""
if self.is_text_modified():
reply = QMessageBox.question(
self, "提示", "当前内容已修改,是否保存?",
QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel
)
if reply == QMessageBox.Save:
self.save_file()
elif reply == QMessageBox.Cancel:
return
# 清空文本区并重置标题
self.text_edit.clear()
self.setWindowTitle("无标题-记事本")
self.status_bar.showMessage("新建空白文件成功", 2000)
def open_file(self):
"""打开文件:选择文件并读取内容"""
if self.is_text_modified():
reply = QMessageBox.question(
self, "提示", "当前内容已修改,是否保存?",
QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel
)
if reply == QMessageBox.Save:
self.save_file()
elif reply == QMessageBox.Cancel:
return
# 弹出文件选择对话框(仅选.txt文件)
file_path, _ = QFileDialog.getOpenFileName(
self, "打开文件", "./", "文本文件 (*.txt);;所有文件 (*.*)"
)
if not file_path:
return
# 读取文件内容(QFile)
file = QFile(file_path)
if file.open(QIODevice.ReadOnly | QIODevice.Text):
# 读取字节并转换为UTF-8字符串(避免中文乱码)
content = file.readAll().data().decode("utf-8")
self.text_edit.setText(content)
file.close()
# 更新窗口标题(QFileInfo获取文件名)
file_info = QFileInfo(file_path)
self.setWindowTitle(f"{file_info.fileName()}-记事本")
self.status_bar.showMessage(f"已打开文件:{file_info.fileName()}", 2000)
def save_file(self):
"""保存文件:未命名则触发另存为,已命名则覆盖"""
current_title = self.windowTitle()
if current_title == "无标题-记事本":
self.save_as_file()
return
# 从标题提取文件名(如“test.txt-记事本”→“test.txt”)
file_name = current_title.replace("-记事本", "")
file_path = QFileInfo(file_name).absoluteFilePath()
# 写入文件(QFile)
file = QFile(file_path)
if file.open(QIODevice.WriteOnly | QIODevice.Text):
# 获取文本区内容并编码为字节
content = self.text_edit.toPlainText().encode("utf-8")
file.write(content)
file.close()
# 重置标题(移除“*”标记)
self.setWindowTitle(f"{file_name}-记事本")
self.status_bar.showMessage(f"文件保存成功:{file_name}", 2000)
def save_as_file(self):
"""另存为文件:选择保存路径和文件名"""
file_path, _ = QFileDialog.getSaveFileName(
self, "另存为", "./未命名.txt", "文本文件 (*.txt);;所有文件 (*.*)"
)
if not file_path:
return
# 补充.txt后缀(若用户未输入)
if not file_path.endswith(".txt"):
file_path += ".txt"
# 写入文件
file = QFile(file_path)
if file.open(QIODevice.WriteOnly | QIODevice.Text):
content = self.text_edit.toPlainText().encode("utf-8")
file.write(content)
file.close()
# 更新窗口标题
file_info = QFileInfo(file_path)
self.setWindowTitle(f"{file_info.fileName()}-记事本")
self.status_bar.showMessage(f"文件另存成功:{file_info.fileName()}", 2000)
def set_font(self):
"""设置字体:弹出QFontDialog选择字体"""
# 获取当前文本区字体作为初始值
current_font = self.text_edit.font()
font, ok = QFontDialog.getFont(current_font, self, "选择字体")
if ok:
self.text_edit.setFont(font)
self.status_bar.showMessage(f"字体设置成功:{font.family()} {font.pointSize()}号", 2000)
def set_text_color(self):
"""设置文本颜色:弹出QColorDialog选择颜色"""
# 获取当前文本颜色作为初始值
current_color = self.text_edit.textColor()
color = QColorDialog.getColor(current_color, self, "选择文本颜色")
if color.isValid():
self.text_edit.setTextColor(color)
self.status_bar.showMessage(f"文本颜色设置成功:{color.name()}", 2000)
def on_text_changed(self):
"""文本变化时更新窗口标题(添加“*”标记)"""
if not self.is_text_modified():
current_title = self.windowTitle()
self.setWindowTitle(f"*{current_title}")
def is_text_modified(self):
"""判断文本是否已修改(标题含“*”或为未命名文件且有内容)"""
current_title = self.windowTitle()
has_content = len(self.text_edit.toPlainText().strip()) > 0
return "*" in current_title or (current_title == "无标题-记事本" and has_content)
def closeEvent(self, event):
"""窗口关闭事件:处理未保存内容"""
if self.is_text_modified():
reply = QMessageBox.question(
self, "提示", "当前内容已修改,是否保存后退出?",
QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel
)
if reply == QMessageBox.Save:
self.save_file()
event.accept() # 保存后允许关闭
elif reply == QMessageBox.Discard:
event.accept() # 不保存直接关闭
else:
event.ignore() # 取消关闭
else:
event.accept()
if __name__ == "__main__":
# 初始化PyQt应用
app = QApplication(sys.argv)
# 创建记事本实例并显示
notepad = Notepad()
notepad.show()
# 运行应用主循环
sys.exit(app.exec_())
代码输出结果为

该记事本的功能就是上面所写的新建,打开,保存,剪切,复制,粘贴等,代码比较多,需要慢慢消化,记住核心作用即可
四、关键类详解:PyQt5的“功能模块”
记事本开发依赖多个PyQt5核心类,这些类是实现功能的“工具包”,需掌握其导入方式、核心方法和适用场景。
1. 文件操作类:QFile与QFileInfo
(1)QFile:处理文件的“读-写-删”
- 导入方式:
from PyQt5.QtCore import QFile - 核心功能:
- 打开文件:支持
ReadOnly(只读)、WriteOnly(只写)、Append(追加)等模式,如file.open(QFile.ReadOnly | QFile.Text)(文本模式只读); - 读取内容:
read(int maxSize)(读指定字节)、readAll()(读全部内容)、readLine()(读一行); - 写入内容:
write(bytes data)(写字节数据)、putChar(str char)(写单个字符); - 状态管理:
exists()(判断文件是否存在)、isReadable()(是否可读)、close()(关闭文件,必须调用); - 文件管理:
remove()(删除文件)、rename(str newName)(重命名)、copy(str newPath)(复制文件)。
- 打开文件:支持
(2)QFileInfo:获取文件的“元信息”
- 导入方式:
from PyQt5.QtCore import QFileInfo - 核心功能:
- 基础信息:
fileName()(文件名,含扩展名)、baseName()(文件名,不含扩展名)、suffix()(扩展名)、absoluteFilePath()(绝对路径); - 时间信息:
created()(创建时间)、lastModified()(最后修改时间)、lastRead()(最后访问时间); - 状态判断:
isFile()(是否为普通文件)、isDir()(是否为目录)、size()(文件大小,字节)。
- 基础信息:
2. 界面交互类:QMainWindow、QMenu、QAction
(1)QMainWindow:主窗口的“框架管理者”
- 导入方式:
from PyQt5.QtWidgets import QMainWindow - 核心方法:
setCentralWidget(QWidget):设置中心部件(如记事本的QTextEdit);menuBar():获取/创建菜单栏,后续通过addMenu()添加菜单;addToolBar(str title):创建工具栏,通过addAction()添加快捷按钮;statusBar():获取/创建状态栏,showMessage(str text, int msec)(显示临时消息);setWindowTitle(str title)(设窗口标题)、resize(int w, int h)(设窗口大小)。
(2)QMenu、QAction:菜单与动作的“定义者”
- 导入方式:
from PyQt5.QtWidgets import QMenu, QAction - 核心功能:
QMenu:创建菜单(如“文件”菜单),支持addAction()(加动作)、addSeparator()(加分隔线)、addMenu()(加子菜单);QAction:定义“可交互的动作”(如“新建”选项),支持setShortcut()(设快捷键)、setStatusTip()(设状态栏提示)、triggered.connect(slot)(绑定槽函数)。
3. 文本编辑类:QTextEdit
- 导入方式:
from PyQt5.QtWidgets import QTextEdit - 核心功能:
- 文本处理:
setText(str)(设文本)、toPlainText()(获纯文本)、setHtml(str)(设HTML文本)、clear()(清空文本); - 格式设置:
setFont(QFont)(设字体)、setTextColor(QColor)(设文本颜色)、setAlignment(Qt.Alignment)(设对齐方式,如居中Qt.AlignCenter); - 状态监控:
textChanged()信号(文本变化时触发)。
- 文本处理:
4. 对话框类:QFileDialog、QFontDialog、QColorDialog
对话框是用户与程序交互的“弹窗工具”,无需手动设计界面,直接调用即可。
(1)QFileDialog:文件选择对话框
- 导入方式:
from PyQt5.QtWidgets import QFileDialog - 核心方法:
getOpenFileName():选单个文件(返回文件路径);getOpenFileNames():选多个文件(返回路径列表);getSaveFileName():保存文件(返回保存路径);getExistingDirectory():选目录(返回目录路径)。
(2)QFontDialog:字体选择对话框
- 导入方式:
from PyQt5.QtWidgets import QFontDialog - 核心方法:
getFont()(弹出字体选择框,返回选中的QFont对象和确认状态),如:font, ok = QFontDialog.getFont() if ok: self.text_edit.setFont(font) # 将选中字体应用到文本区
(3)QColorDialog:颜色选择对话框
- 导入方式:
from PyQt5.QtWidgets import QColorDialog - 核心方法:
getColor()(弹出颜色选择框,返回选中的QColor对象),如:color = QColorDialog.getColor() if color.isValid(): self.text_edit.setTextColor(color) # 将选中颜色应用到文本
5. 其他关键类
- QKeySequence:定义快捷键(如
Ctrl+S),导入from PyQt5.QtGui import QKeySequence,支持预定义键(如QKeySequence.Save); - QColor:处理颜色,导入
from PyQt5.QtGui import QColor,支持RGB、十六进制、颜色名等创建方式(如QColor(255,0,0)红色); - QToolButton:工具栏按钮,导入
from PyQt5.QtWidgets import QToolButton,支持设图标、下拉菜单、切换状态。
五、总结
基于QMainWindow实现记事本,核心是“理清框架-掌握工具-落地逻辑”:
- 框架层面:用
QMainWindow搭建主窗口,快速实现菜单栏、工具栏、状态栏的标准化布局; - 工具层面:熟练使用
QFile(文件读写)、QTextEdit(文本处理)、对话框类(用户交互)等核心组件,这些是实现功能的“基础工具”; - 逻辑层面:重点处理“文件操作中的用户提示”(如未保存内容的弹窗)和“信号与槽的绑定”,确保功能流畅且符合用户习惯。

9331

被折叠的 条评论
为什么被折叠?



