文本浏览器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例子
# -*- 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())