python pyside2 Text Browser(QTextBrowser)

介绍

QTextBrowser 是 PySide2 中一个功能强大的富文本浏览组件,支持显示 HTML 内容、超链接、列表等,还可以实现简单的文本编辑和导航功能。

通过结合 HTML 格式和信号处理,QTextBrowser 可以实现丰富的文本展示和交互功能,是 PySide2 中处理富文本的重要组件。

应用场景

  • 显示帮助文档或用户手册
  • 实现简单的网页浏览器
  • 日志显示组件
  • 富文本编辑器的预览窗口
  • 聊天记录显示区域

例子

import sys
from PySide2.QtWidgets import (QApplication, QMainWindow, QTextBrowser, 
                             QVBoxLayout, QHBoxLayout, QWidget, QPushButton,
                             QLineEdit, QLabel)
from PySide2.QtCore import Qt, QUrl
from PySide2.QtGui import QFont, QTextCursor

class TextBrowserDemo(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QTextBrowser 教程")
        self.resize(800, 600)

        # 创建中心部件和主布局
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        main_layout = QVBoxLayout(central_widget)

        # 创建QTextBrowser组件
        self.text_browser = QTextBrowser()

        # 设置字体
        font = QFont()
        font.setPointSize(10)
        self.text_browser.setFont(font)

        # 添加到主布局
        main_layout.addWidget(self.text_browser)

        # 创建控制按钮区域
        control_layout = QHBoxLayout()

        # 添加文本按钮
        self.add_text_btn = QPushButton("添加普通文本")
        self.add_text_btn.clicked.connect(self.add_plain_text)
        control_layout.addWidget(self.add_text_btn)

        # 添加HTML按钮
        self.add_html_btn = QPushButton("添加HTML内容")
        self.add_html_btn.clicked.connect(self.add_html_content)
        control_layout.addWidget(self.add_html_btn)

        # 清除按钮
        self.clear_btn = QPushButton("清除内容")
        self.clear_btn.clicked.connect(self.text_browser.clear)
        control_layout.addWidget(self.clear_btn)

        # 导航按钮
        self.back_btn = QPushButton("后退")
        self.back_btn.clicked.connect(self.text_browser.backward)
        control_layout.addWidget(self.back_btn)

        self.forward_btn = QPushButton("前进")
        self.forward_btn.clicked.connect(self.text_browser.forward)
        control_layout.addWidget(self.forward_btn)

        # 添加到主布局
        main_layout.addLayout(control_layout)

        # 创建链接演示区域
        link_layout = QHBoxLayout()
        link_layout.addWidget(QLabel("链接示例:"))

        self.link_input = QLineEdit("https://www.qt.io")
        self.open_link_btn = QPushButton("打开链接")
        self.open_link_btn.clicked.connect(self.open_link)

        link_layout.addWidget(self.link_input)
        link_layout.addWidget(self.open_link_btn)

        main_layout.addLayout(link_layout)

        # 初始内容
        self.init_content()

        # 连接链接点击信号
        self.text_browser.anchorClicked.connect(self.handle_link_click)

    def init_content(self):
        """初始化显示内容"""
        self.text_browser.setHtml("""
        <h1>QTextBrowser 演示</h1>
        <p>这是一个 QTextBrowser 组件的使用示例。</p>
        <p>支持的功能:</p>
        <ul>
            <li>显示普通文本</li>
            <li>显示 HTML 格式内容</li>
            <li>处理超链接</li>
            <li>文本导航(前进/后退)</li>
        </ul>
        <p>点击 <a href="internal:example">这个内部链接</a> 查看效果</p>
        """)

    def add_plain_text(self):
        """添加普通文本"""
        text = "\n这是新添加的普通文本。可以包含换行符等内容。"
        self.text_browser.append(text)

        # 滚动到末尾
        self.text_browser.moveCursor(QTextCursor.End)

    def add_html_content(self):
        """添加HTML格式内容"""
        html = """
        <h3>新添加的HTML内容</h3>
        <p style="color: blue;">这是蓝色的文本</p>
        <p><b>粗体文本</b> 和 <i>斜体文本</i></p>
        <table border="1">
            <tr><th>表头1</th><th>表头2</th></tr>
            <tr><td>单元格1</td><td>单元格2</td></tr>
        </table>
        """
        self.text_browser.insertHtml(html)

        # 滚动到末尾
        self.text_browser.moveCursor(QTextCursor.End)

    def open_link(self):
        """打开指定链接"""
        url = self.link_input.text()
        if url:
            # 设置新的页面内容,这会添加到导航历史
            self.text_browser.setHtml(f"<h2>正在查看: {url}</h2><p>这是链接页面的模拟内容</p>")

    def handle_link_click(self, url):
        """处理链接点击事件"""
        # 处理内部链接
        if url.scheme() == "internal":
            if url.path() == "example":
                self.text_browser.setHtml("""
                <h2>内部链接页面</h2>
                <p>这是一个内部链接指向的页面</p>
                <p><a href="#">返回首页</a></p>
                """)
        else:
            # 外部链接可以在这里处理,比如用默认浏览器打开
            print(f"打开外部链接: {url.toString()}")
            # 如果要在QTextBrowser中显示外部网页内容,需要额外的网络请求代码

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

关键功能解析

  1. 基本内容操作

    • append(text): 添加普通文本并自动换行
    • insertHtml(html): 插入HTML格式内容
    • setHtml(html): 设置整个内容为HTML
    • clear(): 清除所有内容
  2. 导航功能

    • backward(): 后退到上一页
    • forward(): 前进到下一页
    • home(): 回到初始页面
    • 导航功能需要通过 setHtml() 或 setPlainText() 来建立页面历史
  3. 链接处理

    • anchorClicked 信号:当点击链接时触发
    • 可以通过自定义协议(如 internal:)区分内部链接和外部链接
    • 外部链接可以用系统默认浏览器打开(需要额外代码)
  4. 文本导航与编辑

    • 使用 QTextCursor 可以控制文本插入位置
    • moveCursor() 方法可以滚动文本到指定位置
    • 可以通过 setReadOnly(False) 允许用户编辑内容

原文出处:/show_1GW1sEfMnUx2.html