PySide6 GUI 学习笔记——常用类及控件使用方法(多行文本控件QTextEdit)

文章目录

PySide6.QtWidgets.QTextEdit 应用举例

概述

QTextEditPySide6 中用于编辑和显示纯文本和富文本的控件。它提供了强大的文本处理能力,支持 HTML 样式标签和 Markdown 格式,能够处理大型文档并快速响应用户输入。

核心特性

  • 支持纯文本和富文本(HTML 4 子集)编辑

  • Markdown 格式支持

  • 自动换行和格式控制

  • 撤销/重做功能

  • 查找替换功能

  • 自定义拖放操作

  • 多种编辑和只读模式键盘快捷键

常用方法

文本内容操作

方法 描述
setPlainText(text: str) 设置纯文本内容
toPlainText() -> str 获取纯文本内容
setHtml(html: str) 设置 HTML 内容
toHtml() -> str 获取 HTML 内容
setMarkdown(markdown: str) 设置 Markdown 内容
toMarkdown() -> str 获取 Markdown 内容
clear() 清空所有内容
append(text: str) 在文档末尾追加新段落

光标和选择操作

方法 描述
textCursor() -> QTextCursor 获取当前光标
setTextCursor(QTextCursor) 设置当前光标
cursorForPosition(QPoint) -> QTextCursor 获取指定位置的光标
cursorRect() -> QRect 获取光标矩形区域
selectAll() 全选所有文本
copy() 复制选中内容
cut() 剪切选中内容
paste() 粘贴内容

格式和样式

方法 描述
setAlignment(Qt.Alignment) 设置段落对齐方式
setFontFamily(family: str) 设置字体族
setFontPointSize(size: float) 设置字体大小(磅值)
setFontWeight(weight: int) 设置字体粗细
setFontItalic(italic: bool) 设置斜体
setFontUnderline(underline: bool) 设置下划线
mergeCurrentCharFormat(QTextCharFormat) 合并当前字符格式

查找功能

方法 描述
find(pattern: str, options: QTextDocument.FindFlags) -> bool 查找文本模式

视图控制

方法 描述
ensureCursorVisible() 确保光标可见
scrollToAnchor(name: str) 滚动到指定锚点

状态设置

方法 描述
setReadOnly(ro: bool) 设置只读模式
setPlaceholderText(text: str) 设置占位文本
setLineWrapMode(mode: QTextEdit.LineWrapMode) 设置换行模式
setLineWrapColumnOrWidth(width: int) 设置换行宽度/列数

常用信号

信号 描述
textChanged() 文本内容改变时触发
cursorPositionChanged() 光标位置改变时触发
selectionChanged() 选择区域改变时触发
copyAvailable(bool) 复制可用状态改变时触发
redoAvailable(bool) 重做可用状态改变时触发
undoAvailable(bool) 撤销可用状态改变时触发

代码示例

python 复制代码
import sys
from PySide6.QtWidgets import (
    QApplication, QMainWindow, QTextEdit, 
    QVBoxLayout, QWidget, QPushButton
)
from PySide6.QtGui import QTextCharFormat, QFont, QColor
from PySide6.QtCore import Qt

class TextEditorDemo(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QTextEdit 示例")
        self.setGeometry(100, 100, 800, 600)
        
        # 创建主控件和布局
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        layout = QVBoxLayout(central_widget)
        
        # 创建文本编辑器
        self.text_edit = QTextEdit()
        self.text_edit.setPlaceholderText("在此输入内容...")
        self.text_edit.setLineWrapMode(QTextEdit.WidgetWidth)
        layout.addWidget(self.text_edit, 1)
        
        # 创建按钮面板
        button_layout = self.create_button_panel()
        layout.addLayout(button_layout)
        
        # 连接信号
        self.text_edit.textChanged.connect(self.on_text_changed)
        self.text_edit.cursorPositionChanged.connect(self.on_cursor_moved)
    
    def create_button_panel(self):
        from PySide6.QtWidgets import QHBoxLayout
        
        button_layout = QHBoxLayout()
        
        # 格式按钮
        btn_bold = QPushButton("粗体")
        btn_bold.clicked.connect(self.toggle_bold)
        button_layout.addWidget(btn_bold)
        
        btn_italic = QPushButton("斜体")
        btn_italic.clicked.connect(self.toggle_italic)
        button_layout.addWidget(btn_italic)
        
        btn_color = QPushButton("颜色")
        btn_color.clicked.connect(self.change_color)
        button_layout.addWidget(btn_color)
        
        # 功能按钮
        btn_clear = QPushButton("清空")
        btn_clear.clicked.connect(self.text_edit.clear)
        button_layout.addWidget(btn_clear)
        
        btn_html = QPushButton("获取HTML")
        btn_html.clicked.connect(self.print_html)
        button_layout.addWidget(btn_html)
        
        return button_layout
    
    def toggle_bold(self):
        fmt = QTextCharFormat()
        fmt.setFontWeight(QFont.Bold if not self.text_edit.fontWeight() > QFont.Normal else QFont.Normal)
        self.text_edit.mergeCurrentCharFormat(fmt)
    
    def toggle_italic(self):
        fmt = QTextCharFormat()
        fmt.setFontItalic(not self.text_edit.fontItalic())
        self.text_edit.mergeCurrentCharFormat(fmt)
    
    def change_color(self):
        fmt = QTextCharFormat()
        fmt.setForeground(QColor("blue"))
        self.text_edit.mergeCurrentCharFormat(fmt)
    
    def on_text_changed(self):
        print("文本内容已更改")
    
    def on_cursor_moved(self):
        print(f"光标位置: {self.text_edit.textCursor().position()}")
    
    def print_html(self):
        html = self.text_edit.toHtml()
        print("HTML内容:")
        print(html[:200] + "..." if len(html) > 200 else html)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = TextEditorDemo()
    window.show()
    sys.exit(app.exec())

运行效果:

示例说明

1. 基本设置

  • 创建主窗口和布局

  • 添加 QTextEdit 控件并设置占位文本和换行模式

  • 连接文本变化和光标移动信号

2. 文本格式化功能

  • 粗体/斜体切换按钮

  • 更改文本颜色功能

  • 通过 QTextCharFormat 和 mergeCurrentCharFormat 应用格式

3. 功能按钮

  • 清空编辑器内容

  • 打印当前内容的 HTML 表示

  • 获取纯文本内容

4. 信号处理

  • 监听文本变化事件

  • 跟踪光标位置变化

这个示例展示了 QTextEdit 的核心功能,包括文本编辑、格式控制、内容获取和信号处理。您可以根据需要扩展功能,如添加查找替换、Markdown支持或自定义拖放操作。

相关推荐
wt_cs18 分钟前
银行回单ocr api集成解析-图像文字识别-文字识别技术
开发语言·python
you458038 分钟前
小程序学习笔记:使用 MobX 实现全局数据共享,实例创建、计算属性与 Actions 方法
笔记·学习·小程序
_WndProc40 分钟前
【Python】Flask网页
开发语言·python·flask
笑衬人心。40 分钟前
初学Spring AI 笔记
人工智能·笔记·spring
互联网搬砖老肖42 分钟前
Python 中如何使用 Conda 管理版本和创建 Django 项目
python·django·conda
测试者家园1 小时前
基于DeepSeek和crewAI构建测试用例脚本生成器
人工智能·python·测试用例·智能体·智能化测试·crewai
大模型真好玩1 小时前
准确率飙升!Graph RAG如何利用知识图谱提升RAG答案质量(四)——微软GraphRAG代码实战
人工智能·python·mcp
Brookty1 小时前
【MySQL】JDBC编程
java·数据库·后端·学习·mysql·jdbc
UQI-LIUWJ1 小时前
计算机组成笔记:缓存替换算法
笔记·缓存
前端付豪1 小时前
11、打造自己的 CLI 工具:从命令行到桌面效率神器
后端·python