第二章 控件学习
一、QPlainTextEdit 基础认知
QPlainTextEdit 是 PyQt/PySide 框架中用于处理纯文本的高效控件,它专为大量文本内容设计,比 QTextEdit 更轻量级且性能更优,适合实现编辑器、日志查看器等场景。
二、最简单的 QPlainTextEdit 实现
下面是创建 QPlainTextEdit 并显示的基础案例:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPlainTextEdit
# 创建应用实例
app = QApplication(sys.argv)
# 创建主窗口
window = QMainWindow()
window.setWindowTitle("QPlainTextEdit 示例")
window.setGeometry(100, 100, 800, 600)
# 创建 QPlainTextEdit 实例
text_edit = QPlainTextEdit()
text_edit.setPlaceholderText("请输入文本...") # 设置占位文本
# 设置为窗口中央部件
window.setCentralWidget(text_edit)
# 显示窗口
window.show()
# 进入应用主循环
sys.exit(app.exec_())

代码解读:
- 导入必要模块(应用、窗口、文本编辑控件)
- 创建应用和窗口,设置基本属性
- 实例化 QPlainTextEdit 并设置占位文本(未输入时显示)
- 将文本编辑框设为窗口中央部件
- 显示窗口并进入事件循环
三、核心功能与实用案例
1. 文本内容操作
# 设置文本内容
text_edit.setPlainText("这是一段纯文本内容")
# 获取文本内容
content = text_edit.toPlainText()
print("文本内容:", content)
# 追加文本
text_edit.appendPlainText("\n追加的新行文本")
# 清空文本
text_edit.clear()
2. 只读模式与格式设置
# 设置为只读模式(用于显示日志等场景)
text_edit.setReadOnly(True)
# 设置字体
from PyQt5.QtGui import QFont
font = QFont("Consolas", 10) # 等宽字体适合代码/日志
text_edit.setFont(font)
# 设置文本行数(适合代码编辑器)
text_edit.setLineWrapMode(QPlainTextEdit.NoWrap) # 不自动换行
3. 光标控制与选择
from PyQt5.QtGui import QTextCursor
# 获取光标
cursor = text_edit.textCursor()
# 移动光标到文本末尾
cursor.movePosition(QTextCursor.End)
text_edit.setTextCursor(cursor)
# 选择文本
cursor.movePosition(QTextCursor.StartOfLine)
cursor.movePosition(QTextCursor.EndOfLine, QTextCursor.KeepAnchor)
text_edit.setTextCursor(cursor) # 应用选择
# 在光标位置插入文本
cursor.insertText("插入的文本")
4. 信号与事件处理
# 文本改变时触发
text_edit.textChanged.connect(lambda: print("文本已修改"))
# 光标位置改变时触发
text_edit.cursorPositionChanged.connect(lambda: print("光标位置已改变"))
# 右键菜单事件(自定义菜单)
text_edit.setContextMenuPolicy(Qt.CustomContextMenu)
text_edit.customContextMenuRequested.connect(self.show_context_menu)
def show_context_menu(self, position):
menu = text_edit.createStandardContextMenu() # 创建标准菜单
# 添加自定义菜单项
menu.addAction("自定义操作")
menu.exec_(text_edit.mapToGlobal(position))
四、实用场景案例
1. 简易代码编辑器
import sys
from PyQt5.QtGui import QFont, QColor, QTextCharFormat, QSyntaxHighlighter
from PyQt5.QtCore import Qt, QRegularExpression
from PyQt5.QtWidgets import (QApplication, QMainWindow, QPlainTextEdit, QFileDialog,
QAction, QMessageBox, QMenuBar, QToolBar, QStatusBar)
from PyQt5.QtGui import QFont # 从QtGui模块导入QFont
class PythonHighlighter(QSyntaxHighlighter):
"""Python语法高亮器"""
def __init__(self, document):
super().__init__(document)
# 定义语法规则和对应的格式
self.rules = []
# 关键字
keywords = [
'and', 'assert', 'break', 'class', 'continue', 'def',
'del', 'elif', 'else', 'except', 'False', 'finally',
'for', 'from', 'global', 'if', 'import', 'in', 'is',
'lambda', 'None', 'nonlocal', 'not', 'or', 'pass',
'raise', 'return', 'True', 'try', 'while', 'with', 'yield'
]
# 函数
functions = r'\b[A-Za-z0-9_]+(?=\()'
# 字符串
string1 = r'\'.*?\''
string2 = r'\".*?\"'
# 注释
comment = r'#.*$'
# 设置格式
keyword_format = QTextCharFormat()
keyword_format.setForeground(QColor(127, 0, 85))
keyword_format.setFontWeight(QFont.Bold)
function_format = QTextCharFo

最低0.47元/天 解锁文章
1065

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



