37- 输入和显示-文本浏览器QTextBrowser

文本浏览器QTextBrowser

扩展了QTextEdit(只读模式),添加了一些导航功能,以便用户可以跟踪超文本文档中的链接。

  • 如果要为用户提供可编辑的富文本编辑器,请使用QTextEdit 。
  • 如果想要一个没有超文本导航的文本浏览器,使用QTextEdit,并使用setReadOnly()禁用编辑。
  • 如果只需要显示一小段富文本,使用QLabel

QTextBrowser 是 QTextEdit 的只读版本,它继承了 QTextEdit 全部的特性,支持的 HTML 标记语言子集也是一样的。

QTextBrowser 还有更多增强功能,用于打开浏览 HTML 内部的超链接。QTextBrowser 本身就是 HTML 文件浏览器,虽然支持的只是 HTML 子集。

from PySide6.QtWidgets import QTextBrowser

QTextBrowser(parent: Union[PySide6.QtWidgets.QWidget,NoneType]=None)-> None

QTextBrowser 显示的内容可以用基类的 setHtml()、setPlainText()等函数,另外 QTextBrowser 还有自己专属的打开文件链接函数:

setSource(const :QUrl str)

doSetSource(name: Union[PySide6.QtCore.QUrl,str],
            type: PySide6.QtGui.QTextDocument.ResourceType=Instance(PySide6.QtGui.QTextDocument.UnknownResource))-> None

这是一个槽函数,它参数类似 QUrl(“file:///D:/QtProjects/ch05/simplebrowser/opensuse.htm”)文件链接,自动打开并解析 HTML 文件内容,然后显示到控件界面。

当源文件链接 Source 发生变化时,会触发信号:

sourceChanged(const QUrl & src)

参数 src 是新的链接地址,通过这个信号可以跟踪浏览的源文件链接变化。

import sys
from PySide6.QtWidgets import QApplication,QWidget,QLabel,QTextEdit,QTextBrowser,QHBoxLayout,QVBoxLayout


class Demo(QWidget):
    def __init__(self):
        super(Demo,self).__init__()
        self.edit_label=QLabel('QTextEdit',self)
        self.browser_label=QLabel('QTextBrowser',self)
        self.text_edit=QTextEdit(self)
        self.text_edit.insertPlainText("<font color='red'>Hello World~</font>")

        self.text_browser=QTextBrowser(self)

        self.edit_v_layout=QVBoxLayout()
        self.browser_v_layout=QVBoxLayout()
        self.all_h_layout=QHBoxLayout()

        self.layout_init()
        self.text_edit_init()

    def layout_init(self):
        self.edit_v_layout.addWidget(self.edit_label)
        self.edit_v_layout.addWidget(self.text_edit)

        self.browser_v_layout.addWidget(self.browser_label)
        self.browser_v_layout.addWidget(self.text_browser)

        self.all_h_layout.addLayout(self.edit_v_layout)
        self.all_h_layout.addLayout(self.browser_v_layout)

        self.setLayout(self.all_h_layout)

    def text_edit_init(self):
        self.text_edit.textChanged.connect(self.show_text_func)# 1

    def show_text_func(self):
        self.text_browser.setText(self.text_edit.toPlainText())# 2


if __name__=='__main__':
    app=QApplication(sys.argv)
    demo=Demo()
    demo.show()
    sys.exit(app.exec())

方法

方法返回值说明
backwardHistoryCount()int返回历史中向后的位置数。
clearHistory()None清除已访问文档的历史记录,并禁用向前和向后导航。
forwardHistoryCount()int返回历史记录中向前的位置数。
historyTitle(arg__1:int)str返回 HistoryItem 的文档标题()。
i< 0 向后()历史
i==0 当前,请参阅源()
i> 0 前进()历史
historyUrl(arg__1:int)PySide6.QtCore.QUrl返回历史记录项的 URL。
i< 0 向后()历史
i==0 当前,请参阅源()
i> 0 前进()历史
isBackwardAvailable()bool返回在文档历史记录中是否可以回退使用back()
isForwardAvailable()bool返回在文档历史记录中是否可以前进使用forward()
openExternalLinks()bool获取是否应使用openUrl()自动打开指向外部源的链接,而不是发出anchorClickd信号。如果链接的方案既不是文件也不是qrc,则将其视为外部链接。
默认值为false。
openLinks()bool获取是否自动打开用户通过鼠标或键盘激活的链接。
无论此属性的值如何,始终发出 anchorClicked 信号。
setSearchPaths(paths)None设置存文本浏览器用于查找支持内容的搜索路径。
paths:list
searchPaths()list of strings此属性保存文本浏览器用于查找支持内容的搜索路径。
QTextBrowser使用此列表来查找图像和文档。
默认情况下,此属性包含一个空字符串列表。
setOpenExternalLinks(open)bool指定 QTextBrowser 是否应使用openUrl()而不是发出 anchorClicked 信号自动打开指向外部源的链接。如果链接的方案既不是文件也不是 qrc,则将其视为外部链接。
默认值为 false。
setOpenLinks(open)bool此属性指定 QTextBrowser 是否应自动打开用户尝试通过鼠标或键盘激活的链接。
无论此属性的值如何,始终发出 anchorClicked 信号。
默认值为 true。
[slots]setSource(name:PySide6.QtCore.QUrl[,type=QTextDocument.UnknownResource])None尝试以指定类型加载给定url处的文档。
如果类型为UnknownSource(默认值),则将检测文档类型:
如果url以扩展名.md、.mkd或.makdown结尾,则将通过setMarkdown()加载文档;
否则将通过setHtml()加载。可以通过显式指定类型来绕过此检测。
source()PySide6.QtCore.QUrl此属性保存所显示文档的名称。。
如果没有显示文档或源未知,则这是一个无效的url。
设置此属性时,QTextBrowser会尝试在当前源的searchPaths属性和目录的路径中查找具有指定名称的文档,除非该值是绝对文件路径。它还检查可选的锚点并相应地滚动文档
如果文档中的第一个标记是<qt-type=detail>,则该文档在浏览器窗口中显示为弹出窗口,而不是新文档。否则,文档将在文本浏览器中正常显示,文本将通过setHtml()或setMarkdown()设置为命名文档的内容,具体取决于文件名是否以任何已知的Markdown文件扩展名结尾。
如果希望避免自动类型检测并显式指定类型,请调用setSource()而不是设置此属性。
默认情况下,此属性包含空URL。
sourceType()ResourceType此属性保存所显示文档的类型。
如果未显示任何文档或源的类型未知,则为UnknownSource。
否则,它保存检测到的类型,或调用setSource()时指定的类型。

功能性方法

槽方法说明
backward()将显示的文档更改为通过导航链接生成的文档列表中的上一个文档。如果没有以前的文档,则不执行任何操作。
doSetSource(name[,type=QTextDocument.UnknownResource])尝试以指定类型加载给定url处的文档。
setSource()调用doSetSource。在Qt 5中,setSource(const QUrl&url)是虚拟的。
在Qt6中,doSetSource()是虚拟的,因此可以在子类中重写。
forward()将显示的文档更改为通过导航链接生成的文档列表中的下一个文档。如果没有下一个文档,则不执行任何操作。
home()将显示的文档更改为历史记录中的第一个文档。
reload()重新加载当前集合源。
文档来源和内容

QTextEdit的内容是使用setHtml()或 setPlainText()设置的,

QTextBrowser 实现了 setSource()函数,可设置文本,在搜索路径列表和当前系统目录中查找指定名称名称。

如果文档名称以锚点结尾(例如#anchor),文本浏览器会自动滚动到该位置(使用scrollToAnchor())。

当用户单击超链接时,浏览器将使用链接的值作为参数调用setSource()本身。可以通过连接到 sourceChanged()信号来跟踪当前源。

导航
  • back()和forward()槽,可以使用它们来实现"后退"和"前进"按钮

  • home()插槽将文本设置为显示的第一个文档。

  • 当用户单击锚点时,会发出 anchorClicked()信号。要覆盖浏览器的默认导航行为,调用setSource()函数以在连接到此信号的插槽中提供新的文档文本。

  • 如果要加载存储在Qt资源系统中的文档,使用URL中的方案来加载。例如,对于文档资源路径qrc:/docs/index.html作为 URL,使用setSource()。

信号

信号说明
anchorClicked(QUrl:PySide6.QtCore.QUrl)当用户单击锚点时发出该信号。锚引用的URL在链接中传递。
注意,除非openLinks属性设置为false或在连接的插槽中调用setSource(),否则浏览器将自动处理导航到link指定的位置。此机制用于覆盖浏览器的默认导航功能。
backwardAvailable(bool)当backward()的可用性发生变化时,会发出此信号。当用户在家时,available为false();否则这是真的。
forwardAvailable(bool)当forward()的可用性发生变化时,会发出此信号。available在用户向后导航()后为true,在用户向前导航()时为false。
highlighted(QUrl:PySide6.QtCore.QUrl)当用户已选择但未激活文档中的锚点时,发出该信号。锚引用的URL在链接中传递。
historyChanged()当历史发生变化时,会发出此信号。
sourceChanged(src)该信号在源发生变化时发出,src是新的源。
当调用setSource()、forward()、backward()或home()时,或者当用户单击链接或按下等效的键序列时,都会以编程方式更改源代码。

QTextBrowser例子

image-20230319024223873

# -*- coding: UTF-8 -*-
# File date: Hi_2023/3/15 1:01
# File_name: 02-QTextBrowser例子.py


import sys
from PySide6.QtWidgets import(QApplication,QWidget,QMainWindow
,QLineEdit,QTextBrowser,QPushButton,QVBoxLayout,QHBoxLayout,QFrame,QLabel)
from PySide6.QtCore import QUrl
import urllib
import os

os.chdir(os.path.dirname(__file__))


class TextBrowser(QMainWindow):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.lineEdit = QLineEdit()
        self.lineEdit.setPlaceholderText("在这里添加你想要的数据,回车确认")
        self.lineEdit.returnPressed.connect(self.append_text)

        self.textBrowser = QTextBrowser()
        self.textBrowser.setAcceptRichText(True)
        self.textBrowser.setOpenExternalLinks(True)
        self.textBrowser.setSource(QUrl(r'.\support\textBrowser.html'))
        self.textBrowser.anchorClicked.connect(lambda url: self.statusBar().showMessage('你点击了url'+ urllib.parse.unquote(url.url()),3000))
        self.textBrowser.historyChanged.connect(self.show_anchor)

        self.back_btn = QPushButton('Back')
        self.forward_btn = QPushButton('Forward')
        self.home_btn = QPushButton('Home')
        self.clear_btn = QPushButton('Clear')

        self.back_btn.pressed.connect(self.textBrowser.backward)
        self.forward_btn.pressed.connect(self.textBrowser.forward)
        self.clear_btn.pressed.connect(self.clear_text)
        self.home_btn.pressed.connect(self.textBrowser.home)

        layout = QVBoxLayout()
        layout.addWidget(self.lineEdit)
        layout.addWidget(self.textBrowser)
        frame = QFrame()
        layout.addWidget(frame)

        self.text_show = QTextBrowser()
        self.text_show.setMaximumHeight(70)
        layout.addWidget(self.text_show)

        layout_frame = QHBoxLayout()
        layout_frame.addWidget(self.back_btn)
        layout_frame.addWidget(self.forward_btn)
        layout_frame.addWidget(self.home_btn)
        layout_frame.addWidget(self.clear_btn)
        frame.setLayout(layout_frame)

        widget = QWidget()
        self.setCentralWidget(widget)
        widget.setLayout(layout)

        self.setWindowTitle('QTextBrowser 案例')
        self.setGeometry(300,300,300,300)
        self.show()

    def append_text(self):
        text = self.lineEdit.text()
        self.textBrowser.append(text)
        self.lineEdit.clear()

    def show_anchor(self):
        back = urllib.parse.unquote(self.textBrowser.historyUrl(-1).url())
        now = urllib.parse.unquote(self.textBrowser.historyUrl(0).url())
        forward = urllib.parse.unquote(self.textBrowser.historyUrl(1).url())
        _str = f'上一个url:{back},<br>当前url:{now},<br>下一个url:{forward}'
        self.text_show.setText(_str)

    def clear_text(self):
        self.textBrowser.clear()


if __name__ =='__main__':
    app = QApplication(sys.argv)
    ex = TextBrowser()
    sys.exit(app.exec())

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

士别三日,当挖目相待

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值