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

发布于:2025-06-09 ⋅ 阅读:(23) ⋅ 点赞:(0)

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) 撤销可用状态改变时触发

代码示例

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支持或自定义拖放操作。