33. 网页浏览器
一、网页浏览器
PySide6 提供了可以浏览网页的控件 QWebEngineView
和 QWebEnginePage
,可以利用它们编写网页浏览器,QWebEngineView
位于 QtWebEngineWidgets
模块中,QWebEnginePage
位于 QtWebEngineCore
模块中。
我们可以在终端中使用 pip
安装 PySide6 模块。默认是从国外的主站上下载,因此,我们可能会遇到网络不好的情况导致下载失败。我们可以在 pip
指令后通过 -i
指定国内镜像源下载。
pip install pyside6 -i https://mirrors.aliyun.com/pypi/simple
国内常用的 pip
下载源列表:
- 阿里云 https://mirrors.aliyun.com/pypi/simple
- 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple
- 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple
- 中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple
二、网页浏览器控件
网页浏览器控件 QWebEngineView
继承自 QWidget
,用于管理其内部的网页 QWebEnginePage
,设置内部网页的一些属性。用 QWebEngineView
创建网页浏览器控件的方法如下所示:
QWebEngineView(parent:QWidget=None)
其中 parent
是 网页浏览器控件所在的窗体或容器控件。
网页浏览器控件 QWebEngineView
的常用方法如下所示:
# 实例方法
load(url:QUrl) -> None # 加载网页
url() -> QUrl # 获取网页
setUrl(url:QUrl) -> None # 设置网页
createStandardContextMenu() -> QMenu # 创建标准菜单
createWindow(type:WebWindowType) -> QWebEngineView # 创建QWebEngineView的子类,并重写该函数,用于弹出新的窗口
findText(subString:str, options:FindFlag={}) -> None # 查找网页中的文本
hasSelection() -> bool # 获取当前页中是否有选中的内容
selectedText() -> str # 获取当前页中选中的内容
icon() -> QIcon # 获取当前页的图标
iconUrl() -> QUrl # 获取当前页的图标地址
zoomFactor() -> float # 获取缩放比例
setZoomFactor(factor:float) -> None # 设置网页缩放比例,参数取值范围为0.25~5.0,默认是1.0
print(printer:QPrinter) -> None # 默认使用A4纸打印网页
# 将网页输出成pdf文档
printToPdf(filePath:str, layout:QPageLayout=QPageLayout(QPageSize(QPageSize.A4), QPageLayout.Portrait, QMarginsF()), ranges:QPageRanges={})
title() -> str # 获取网页标题
history() -> QWebEngineHistory # 返回浏览器中当前网页的访问记录
page() -> QWebEnginePage # 获取当前的网页
# 静态方法
static forPage(page:WebEnginePage) -> QWebEngineView # 返回与网页关联的网页浏览器
# 槽函数
reload() -> None # 重新加载网页
forward() -> None # 向前浏览网页
back() -> None # 向后浏览网页
stop() -> None # 停止加载网页
网页浏览器控件 QWebEngineView
的信号如表下所示:
urlChanged(url:QUrl) # 网页地址发生改变时发送信号
titleChanged(title:str) # 网页标题发生改变时发送信号
iconChanged(icon:QIcon) # 网页图标发生改变时发送信号
iconUrlChanged(url:QUrl) # 网页图标的url地址发生改变时发送信号
selectionChanged() # 网页中选择的内容发生改变时发送信号
loadStarted() # 开始加载网页时发送信号
loadProgress(progress:int) # 加载网页元素时发送信号,参数的范数是0~100
loadFinished(success:bool) # 网页加载完成时发送信号,成功是True,出现错误是False
printRequested() # 请求打印时发送信号
printFinished(success:bool) # 打印完成时发送信号
pdfPrintingFinished(filePath:str, success:bool) # 打印成pdf文件结束时发送信号
主要方法是用 load()
方法或 setUrl()
方法 加载网页。用 url()
方法 获取当前网页的 QUrl
地址。根据浏览历史记录,用 forward()
方法 向前浏览网页。用 back()
方法 向后浏览网页。用 reload()
方法 重新加载网页;如果已经有 HTML 格式的文本,用 setHtml()
方法 显示 HTML 格式的文本内容。用 history()
方法 获取浏览记录 QWebEngineHistory
。
对于网页中需要弹出新窗口的链接,需要创建 QWebEngineView
的子类,并重写 createWindow(WebWindowType:QWebEnginePage.WebWindowType)
函数,其中参数 WebWindowType
是 QWebEnginePage.WebWindowType
类型的枚举值,用于判断链接的类型,可以取值如下:
QWebEnginePage.WebWindowType.WebBrowserWindow # 0,纯浏览器窗口
QWebEnginePage.WebWindowType.WebBrowserTab # 1,浏览器切换卡
QWebEnginePage.WebWindowType.WebDialog # 2,网页对话框
QWebEnginePage.WebWindowType.WebBrowserBackgroundTab # 3,没有隐藏当前可见的网页浏览器控件的切换卡
新建一个 webView.py 文件,创建 QWebEngineView
的子类,并重写 createWindow(WebWindowType)
函数。
from PySide6.QtWebEngineWidgets import QWebEngineView
from PySide6.QtWebEngineCore import QWebEnginePage
class MyWebView(QWebEngineView):
def __init__(self, parent=None):
super().__init__(parent)
def createWindow(self, type:QWebEnginePage.WebWindowType):
"""重写createWindow()方法
"""
return self
新建一个 ui.py 文件,用来存放 UI 相关的代码。
from PySide6.QtWidgets import QWidget
from PySide6.QtWidgets import QLabel, QPushButton, QLineEdit
from PySide6.QtWidgets import QHBoxLayout, QVBoxLayout
from webView import MyWebView
class MyUi:
def setupUi(self, window:QWidget):
window.resize(800, 600) # 1.设置窗口对象大小
vertical_layout = QVBoxLayout(window) # 2.创建垂直布局
horizontal_layout = QHBoxLayout() # 3.创建水平布局,并添加到垂直布局中
vertical_layout.addLayout(horizontal_layout)
self.url_label = QLabel("网址(&D):") # 4.创建标签,并添加到水平布局中
horizontal_layout.addWidget(self.url_label)
self.url_lineEdit = QLineEdit() # 5.创建输入框,并添加到水平布局中
horizontal_layout.addWidget(self.url_lineEdit)
self.url_label.setBuddy(self.url_lineEdit) # 6.设置伙伴控件
self.back_button = QPushButton("后退(&B)") # 7.创建按钮,并添加到水平布局中
horizontal_layout.addWidget(self.back_button)
self.forward_button = QPushButton("前进(&F)")
horizontal_layout.addWidget(self.forward_button)
self.rolad_button = QPushButton("重新加载(&R)")
horizontal_layout.addWidget(self.rolad_button)
self.home_button = QPushButton("回到主页(&H)")
horizontal_layout.addWidget(self.home_button)
self.webEngineView = MyWebView() # 6.创建一个WebView,并添加到垂直布局中
vertical_layout.addWidget(self.webEngineView)
self.webEngineView.setUrl("https://www.yuque.com/star-light-glimmer") # 7.设置初始网址
self.url_lineEdit.setText(self.webEngineView.url().toString())
新建一个 widget.py 文件,用来存放业务逻辑相关的代码。
import sys
from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtCore import QUrl
from ui import MyUi
class MyWidget(QWidget):
def __init__(self):
super().__init__() # 1.调用父类Qwidget类的__init__()方法
self.__ui = MyUi()
self.__ui.setupUi(self) # 2.初始化页面
self.__ui.url_lineEdit.returnPressed.connect(self.load_url) # 3.按钮点击时触发信号
self.__ui.back_button.clicked.connect(self.__ui.webEngineView.back)
self.__ui.forward_button.clicked.connect(self.__ui.webEngineView.forward)
self.__ui.rolad_button.clicked.connect(self.__ui.webEngineView.reload)
self.__ui.home_button.clicked.connect(self.home_button_clicked)
self.__ui.webEngineView.urlChanged.connect(self.update_url)
def load_url(self):
url = QUrl.fromUserInput(self.__ui.url_lineEdit.text()) # 1.获取URL
if url.isValid(): # 2.判断URL是否有效
self.__ui.webEngineView.load(url) # 3.加载URL
def home_button_clicked(self):
self.__ui.webEngineView.load("https://www.yuque.com/star-light-glimmer")
def update_url(self, url:QUrl):
self.__ui.url_lineEdit.setText(url.toString())
if __name__ == "__main__":
app = QApplication(sys.argv) # 1.创建一个QApplication类的实例
window = MyWidget() # 2.创建一个窗口
window.show() # 3.展示窗口
sys.exit(app.exec()) # 4.进入程序的主循环并通过exit()函数确保主循环安全结束
三、网页
网页 QWebEnginePage
是指网页浏览器控件 QWebEngineView
中的网页内容,用 QWebEngineView
的 page()
方法可以获取 QWebEnginePage
,用 setPage()
方法可以给浏览器控件设置网页。
用 QWebEnginePage
创建网页实例的方法如下所示:
QWebEnginePage(parent:QObject=None)
QWebEnginePage(profile:QWebEngineProfile,parent:QObject=None)
其中参数 profile
是 对网页的设置、脚本、缓存地址、cookie 的保存策略 等。
网页 QWebEnginePage 的常用方法如下所示:
# 实例方法
load(url:QUrl) -> None # 加载QUrl地址网页
load(request:QWebEngineHttpRequest) -> None # 加载特定的网页
isLoading() -> bool # 判断当前网页是否正在加载
url() -> QUrl # 获取当前网页的地址
requestedUrl() -> QUrl # 获取当前网页的地址
setUrl(url:QUrl) -> None # 加载指定的网页地址
# 给网页需要的设备进行权限设置
setFeaturePermission(securityOrigin:QUrl, feature:Feature, policy:PermissionPolicy) -> None
setUrlRequestInterceptor(interceptor:QWebEngineUrlRequestInterceptor) -> None # 设置拦截器
action(action:WebAction) -> QAction # 获取网页的指定动作,用于例建右键快捷菜单
backgroundColor() -> QColor # 获取网页背景颜色
setBackgroundColor(color:QColor) -> None # 设置背景颜色
contentsSize() -> QSizeF # 获取网页内容的尺寸
devToolsPage() -> QWebEnginePage # 获取开发工具网页
setDevToolsPage(page:QWebEnginePage) -> None # 设置开发者工具
download(url:QUrl, filename:str="") -> None # 下载资源到文件中
findText(subString:str, options:FindFlag={}) -> None # 查找指定的内容
findText(subString:str, options:FindFlag, resultCallback:PyCallable) -> None # 调用指定的函数查找,函数参数是查找结果
hasSelection() -> bool # 获取当前页中是否有选中的内容
selectedText() -> str # 获取当前页中选中的内容
icon() -> QIcon # 获取网页的图标
iconUrl() -> QUrl # 获取网页的地址
isAudioMuted() -> bool # 获取是否处于静音状态
setAudioMuted(muted:bool) -> None # 设置网页静音状态
recentlyAudible() -> bool # 获取是否播放过音额
isVisible() -> bool # 获取网页是否可见
setVisible(visible:bool) -> None # 设置网页是否可见
Pid()int获取渲染进度
replaceMisspelledWord(replacement:str)None用指定的文本替换不能识别的
文本
runJavaScript(scriptSource: str.worldld;int=None运行Java脚本
title() -> str # 获取网页标题
history() -> QWebEngineHistory # 获取历史导航
# 将网页输出成pdf文档
printToPdf(filePath:str, layout:QPageLayout=QPageLayout(QPageSize(QPageSize.A4), QPageLayout.Portrait, QMarginsF()), ranges:QPageRanges={})
profile() -> QWebEngineProfile # 获取QWebEngineProfile
renderProcessPid() -> int # 获取渲染进度
replaceMisspelledWord(replacement:str) -> None # 用指定的文本替换不能识别的文本
# 运行JavaScript脚本
runJavaScript(scriptSource:str, resultCallback:PyCallable) -> None
runJavaScript(scriptSource:str, worldId:int=0, resultCallback:PyCallable={}) -> None
# 保存网页内容到文件中
save(filePath:str, format:SavePageFormat=QWebEngineDownloadRequest.MimeHtmlSaveFormat) -> None
scrollPosition() -> QPointF # 获取网页滚动的位置
setHtml(html:str, baseUrl:QUrl=QUrl()) -> None # 显示HTMI文档内容
webChannel() -> QWebChannel # 获取当前的网络通道
setWebChannel(arg__1:QWebChannel, worldId:int=0) -> None # 设置网络通道
zoomFactor() -> float # 获取缩放比例
setZoomFactor(factor:float) -> None # 设置网页缩放比例,参数取值范围为0.25~5.0,默认是1.0
settings() -> QWebEngineSettings # 获取对网页的设置
# 虚拟方法
acceptNavigationRequest(url:QUrl, type:NavigationType, isMainFrame:bool) -> bool# 重写该函数,设置导航到新地址的处理方式
createWindow(type:WebWindowType) -> QWebEnginePage # 重写该方法创建新网页
triggerAction(action:WebAction, checked: bool=false) -> None # 执行指定的动作
# 设置选择文件时(如上传文件),文件选择模式
chooseFiles(mode:FileSelectionMode, oldFiles:list[str], acceptedMimeTypes:list[str]) -> list[str]
网页 QWebEnginePage
的信号如表下所示:
urlChanged(url:QUrl) # 网页地址发生改变时发送信号
titleChanged(title:str) # 网页标题发生改变时发送信号
iconChanged(icon:QIcon) # 网页图标发生改变时发送信号
iconUrlChanged(url:QUrl) # 网页图标的url地址发生改变时发送信号
selectionChanged() # 网页中选择的内容发生改变时发送信号
visibleChanged(visible:bool) # 网页可见性发生改变时发送信号
geometryChangeRequested(geom:QRect) # 网页位置和尺寸发生改变时发送信号
contentsSizeChanged(size:QSizeF) # 网页大小发生改变时发送信号
audioMutedChanged(muted:bool) # 网页音频静音状态发生改变时发送信号
recentlyAudibleChanged(recentlyAudible:bool) # 静音状态发生改变时发送信号
scrollPositionChanged(position:QPointF) # 网页滚动位置发生改变时发送信号
loadingChanged(loadingInfo:QWebEngineLoadingInfo) # 加载发生改变时发送信号
renderProcessPidChanged(pid:int) # 染过程发生改变时发送信号
fullScreenRequested(fullScreenRequest:QWebEngineFullScreenRequest) # 全屏显示时发送信号
newWindowRequested(request:QWebEngineNewWindowRequest) # 在另一个窗口中加载新网页时发送信号
windowCloseRequested() # 关闭窗口时发送信号
authenticationRequired(requestUrl:QUrl, authenticator:QAuthenticator) # 需要验证时发送信号
navigationRequested(request:QWebEngineNavigationRequest) # 调用acceptNavigationRequest()方法时发送信号
# 需要代理授权时发送信号
proxyAuthenticationRequired(requestUrl:QUrl, authenticator:QAuthenticator, proxyHost:str)
linkHovered(url:str) # 鼠标悬浮在链接上时发送信号
certificateError(certificateError:QWebEngineCertificateError) # 证书出错时发送信号
loadStarted() # 开始加载网页时发送信号
loadProgress(progress:int) # 加载网页元素时发送信号,参数的范数是0~100
loadFinished(success:bool) # 网页加载完成时发送信号,成功是True,出现错误是False
findTextFinished(result:QWebEngineFindTextResult) # 查找文本结束时发送信号
pdfPrintingFinished(filePath:str, success:bool) # 打印成pdf文件结束时发送信号
# (QWebEngineClientCertifieateSelection)选择客户证书时发送信号
selectClientCertificate(clientCertSelection:QWebEngineClientCertificateSelection)
# 渲染非正常中断时发送信号
renderProcessTerminated(terminationStatus:RenderProcessTerminationStatus, exitCode:int)
重写 createWindow(type:WebWindowType)
函数,单击链接后需要产生新网页时可以创建新的网页,如果不重写该函数或者返回值不是 QWebEnginePage
对象,将发送 newWindowRequested()
信号;
重写 acceptNavigationRequest(url:QUrl, type:NavigationType, isMainFrame:bool)
函数方法可以 设置导航到新地址的处理方式,其中参数 type
是 QWebEnginePage.NavigationType
类型的枚举值,用于 确定导航的原因,可以取值如下:
QWebEnginePage.NavigationType.NavigationTypeLinkClicked # 单击链接
QWebEnginePage.NavigationType.NavigationTypeTyped # 加载
QWebEnginePage.NavigationType.NavigationTypeFormSubmitted # 表格提交
QWebEnginePage.NavigationType.NavigationTypeBackForward # 前进或后退动作
QWebEnginePage.NavigationType.NavigationTypeReload # 重新加载
QWebEnginePage.NavigationType.NavigationTypeRedirect # 目录或服务器重新定位或自动重新加载
QWebEnginePage.NavigationType.NavigationTypeOther # 除以上方式之外的其它方式
用 findText(subString:str, options:QWebEnginePage.FindFlag, resultCallback:PyCallable)
方法可以 在网页中查找指定的文本,查找结束后会发送 findTextFinished(QWebEngineFindTextResult)
信号和调用 function(QWebEngineFindTextResult)
函数,参数 QWebEngineFindTextResult
是 查找后的结果对象,其有两个方法 numberOfMatches()
和 activeMatch()
,分别 获取匹配的个数 和 当前匹配的索引;参数 options
是 QWebEnginePage.FindFlags
类型的枚举值,用于设置查找方向,可以取值如下:
QWebEnginePage.FindFlags.FindBackward # 向后查找
QWebEnginePage.FindFlags.FindCaseSensitively # 大小写敏感,默认向前查找和大小写不敏感
用 setFeaturePermission(securityOrigin:QUrl, feature:QWebEnginePage.Feature, policy:QWebEnginePage.PermissionPolicy)
方法可以 给网页需要的一些设备进行权限设置。
其中参数 feature
是 QWebEnginePage.Feature
类型的枚举值,可以取值如下所示;
QWebEnginePage.Feature.Notifications # 网站通知最终用户,对应值为0
QWebEnginePage.Feature.Geolocation # 当地硬件或服务,对应值为1
QWebEnginePage.Feature.MediaAudioCapture # 音设备,如麦克风,对应值为2
QWebEnginePage.Feature.MediaVideoCapture # 视频设备,如摄像头,对应值为3
QWebEnginePage.Feature.MediaAudioVideoCapture # 音额和视频设备,对应值为4
QWebEnginePage.Feature.MouseLock # 将光标锁定在浏览器中,通常用于游戏中,对应值为5
QWebEnginePage.Feature.DesktopVideoCapture # 视频输出,如多人可共享桌面,对应值为6
QWebEnginePage.Feature.DesktopAudioVideoCapture # 视频和音频输出,对应值为7
参数 policy
用来是 QWebEnginePage.PermissionPolicy
类型的枚举值,用于 设置权限,可以取值如下:
QWebEnginePage.PermissionPolicy.PermissionUnknown # 不确定是否已经由用户授权
QWebEnginePage.PermissionPolicy.PermissionGrantedByUser # 用户已经授权
QWebEnginePage.PermissionPolicy.PermissionDeniedByUser # 用户已经拒绝
用 chooseFiles(mode:QWebEnginePage.FileSelectionMode, oldFiles:Sequence[str])
方法 设置网页中选择文件时(如上传文件)的文件选择模式,oldFiles
是 提供建议的文件名前半部分。其中参数 mode
是 QWebEnginePage.FileSelectionMode
类型的枚举值,可以取值如下:
QWebEnginePage.FileSelectionMode.FileSelectOpen # 只能选择一个文件
QWebEnginePage.FileSelectionMode.FileSelectOpenMultiple # 可选多个文件
QWebEnginePage.FileSelectionMode.FileSelectUploadFolder # 选择文件夹
用 save(filePath:str, format:QWebEngineDownloadRequest.SavePageFormat)
方法 保存网页内容到指定文件,其中参数 format
是 QWebEngineDownloadRequest.SavePageFormat
类型的枚举值,用来 设置文件格式,可以取值如下:
QWebEngineDownloadRequest.SavePageFormat.UnknownSaveFormat
QWebEngineDownloadRequest.SavePageFormat.SingleHtmlSaveFormat # 保存到一个HTML文件中,有些信息,如图片不保持
QWebEngineDownloadRequest.SavePageFormat.CompleteHtmlSaveFormat # 保存整个HTML文件,有些信息,如图片保存到文件夹中
QWebEngineDownloadRequest.SavePageFormat.MimeHtmlSaveFormat # 保存成MIME HTML格式
用 status()
方法 获取加载状态,返回值取值如下:
QWebEngineLoadingInfo.LoadStatus.LoadStartedStatus # 加载开始,对应的值0
QWebEngineLoadingInfo.LoadStatus.LoadStoppedStatus # 加载停止,对应的值1
QWebEngineLoadingInfo.LoadStatus.LoadSucceededStatus # 加载成功,对应的值2
QWebEngineLoadingInfo.LoadStatus.LoadFailedStatus # 加载失败,对应的值3
如果加载失败,可以用 errorDomain()
方法 获取失败类型,返回值取值如下:
QWebEngineLoadingInfo.ErrorDomain.NoErrorDomain # 出错类型未知,对应的值0
QWebEngineLoadingInfo.ErrorDomain.InternalErrorDomain # 内容不能被PySide识别,对应的值11
QWebEngineLoadingInfo.ErrorDomain.ConnectionErrorDomain # 网络连接出错 ,对应的值2
QWebEngineLoadingInfo.ErrorDomain.CertificateErrorDomain # 证书出错,对应的值3
QWebEngineLoadingInfo.ErrorDomain.HttpErrorDomain # HTTP连接出错 ,对应的值4
QWebEngineLoadingInfo.ErrorDomain.FtpErrorDomain # FTP连接出错,对应的值5
QWebEngineLoadingInfo.ErrorDomain.DnsErrorDomain # DNS连接出错,对应的值6
destination()
方法 获取新网页的类型,返回值是枚举类型 QWebEngineNewWindowRequest.DestinationType
,可取值如下:
QWebEngineNewWindowRequest.DestinationType.InNewWindow # 新窗口中,对应的值0
QWebEngineNewWindowRequest.DestinationType.InNewTab # 同窗口的切换卡中,对应的值1
QWebEngineNewWindowRequest.DestinationType.InNewDialog # 在没有切换卡、工具栏和URL输入框的新窗口中,对应的值2
QWebEngineNewWindowRequest.DestinationType.InNewBackgroundTab # 在同一个窗口中,没有隐藏当前可见的浏览器),对应的值3
四、历史记录
每个网页都会有一个 QWebEngineHistory
对象,QWebEngineHistory
对象由多个历史记录构成,每个历史记录称为 QWebEngineHistoryItem
(历史项),QWebEngineHistoryItem
项 用于记录曾经访问过的 QUrl
地址和访问时间。用 QWebEnginePage
或 QWebEngineView
的 history()
方法可以 获得网页的 QWebEngineHistory
对象。
QWebEngineHistory 的常用方法如下:
# 实例方法
currentItem() -> QWebEngineHistoryItem # 获取当前的历史项
currentItemIndex() -> int # 获取当前的历史项索引
goToItem(item:QWebEngineHistoryItem) -> None # 将指定的历史项作为当前项,网页也同时跳转
forward() -> None # 将当前项之后的历史项作为当前项.网页也同时前进
back() -> None # 将当前项之前的历史项作为当前项.网页也同时后退
forwardItem() -> QWebEngineHistoryItem # 获取当前项之后的历史项
forwardItems(maxItems:int) -> list[QWebEngineHistoryItem] # 获取当前项之后的最多maxltems个历史项
backItem() -> QWebEngineHistoryItem # 返回当前项之前的历史项
backItems(maxItems:int) -> list[QWebEngineHistoryItem] # 返回当前项之前的最多maxltems个历史项
canGoForward() -> bool # 判断是否可以前进
canGoBack() -> bool # 判断是否可以后退
items() -> list[QWebEngineHistoryItem] # 返回所有历史项
count() -> int # 返回历史项的数量
clear() -> None # 清除所有历史项
QWebEngineHistoryItem
的常用方法如下:
# 实例方法
url() -> QUrl # 获取历史项关联的网址
title() -> str # 获取历史项关联的网页的标题
lastVisited() -> QDateTime # 获取历史项关联的网页最后访问日期和时间
iconUrl() -> QUrl # 获取历史项关联的图标的网址
isValid() -> bool # 判断历史项是否有效
originalUrl() -> QUrl # 获取历史项关联的初始网址