网页浏览QWebEngineView
PySide6 提供了可以浏览网页的控件 QWebEngineView 和 QWebEnginePage;可以利用它们编写网页浏览器,它们位于QtWebEngineWidgets 模块中
网页浏览器控件QWebEngineView
网页浏览器控件QWebEngineView 继承自QWidget,用于管理其内部的网页QWebEnginePage,设置内部网页的一些属性。
用QWebEngineView 创建网页浏览器控件的方法如下所示,其中parent 是网页浏览器控件所在的窗体或容器控件。
from PySide6.QtWebEngineWidgets import QWebEngineView
QWebEngineView(page: PySide6.QtWebEngineCore.QWebEnginePage,parent: Union[PySide6.QtWidgets.QWidget,NoneType]= None)-> None
QWebEngineView(parent: Union[PySide6.QtWidgets.QWidget,NoneType]= None)-> None
QWebEngineView(profile: PySide6.QtWebEngineCore.QWebEngineProfile,parent: Union[PySide6.QtWidgets.QWidget,NoneType]= None)-> None
网页浏览器控件QWebEngineView的常用方法
网页浏览器控件 QWebEngineView 的常用方法如表所示,主要方法:
- 用load(url: Union[QUrl,str])方法或 setUrl(url: Union[QUrl,str])方法加载网页;
- 用url()方法获取当前网页的 QUrl 地址;
- 根据浏览历史记录,用forward()方法向前浏览网页;用back()方法向后浏览网页;用history()方法获取览记录QWebEngineHistory
- 用reload()方法重新加载网页,如果已经有 HTML 格式的文本,用setHtml(html:str)方法显示 HTML格式的文本内容。
- 对于网页中需要弹出新窗日的链接,需要创建 QWebEngineView的子类,并重写 createWindow(QWebEnginePage.WebWindowType)函数,其中枚举类型参数QWebEnginePage.WebWindowType 用于判断链接的类型,可取以下值,分别对应的值是 0~3。:
- QWebEnginePage.WebBrowserWindow(纯浏览器窗口)
- QWebEnginePage.WebBrowserTab(浏览器切换卡)
- QWebEnginePage.WebDialog(网页对话框)
- QWebEnginePage.WebBrowserBackgroundTab(没有隐藏当前可见的网页浏览器控件的切换卡)
QWebEngineView的方法及参数类型 | 返回值的类型 | 说明 |
---|---|---|
load(url:Union[QUrl,str]) | None | 加载网页 |
setUrl(url:Union[QUrl,str]) | None | 加载网页 |
[slot]reload() | None | 重新加载网页 |
[slot]forward() | None | 向前浏览网页 |
[slot]back() | None | 向后浏览网页 |
[slot]stop() | None | 停止加载网页 |
url() | QUrl | 获取网页的 url 地址 |
title() | str | 获取当前网页中用HTML 定义 的标题 |
createStandardContextMenu() | QMenu | 创建标准的快捷菜单 |
createWindow(QWebEnginePage.WebWindowType) | QWebEngineView | 创建QWebEngineView的子类,并重写 该函数,用于弹出新的窗口 |
findText(subString:str) | None | 查找网页中的文本 |
hasSelection() | b001 | 获取当前页中是否有选中的内容 |
selectedText() | str | 获取当前页中选中的内容 |
history() | QWebEngineHistory | 返回浏览器中当前网页的访问记录 |
icon() | QIcon | 获取当前页的图标 |
iconUrl() | QUrI | 获取当前页的图标的 QUrI地址 |
print(printer:QPrinter) | None | 默认用A4纸打印网页 |
printToPdf(filePath: str) | None | 将网页输出成pdf文档 |
setHtml(html; str) | None | 显示HTML格式的文本 |
setPage(page:QWebEnginePage) | None | 设置网页 |
page() | QWebEnginePage | 取当前的网页 |
setZoomFactor(factor: float) | None | 设置网页的缩放比例,参数取值范围为 0.25~5.0,耿认是1.0 |
zoomFactor() | float | 获取缩放比例 |
[static]forPage(QWebEnginePage) | QWebEngineView | 返回与网页关联的网页浏览器 |
网页浏览器控件QWebEngineView 的信号
网页浏览器控件 QWebEngineView 的信号如表所示
主要信号 urlChanged(QUrl),当网页地址发生改变时发送该信号,开始加载网页时发送 loadStarted()信号;
加载网页元素时发送loadProgress(int)信号,参数的范数是0~100,可以用QProgressBar 布局来显示加载进度;
网页加载完成时发送 loadFinished(bool)信号,成功是 True,出现错误是False。
QWebEngineView的信号及参数类型 | 说明 |
---|---|
urlChanged(QUrl) | 网页地址发生改变时发送信号 |
iconChanged(QIcon) | 网页图标发生改变时发送信号 |
iconUrlChanged(QUrl) | 网页图标的url地址发生改变时发送信号 |
loadFinished(bool) | 网页加载完成时发送信号,成功是True,出现错误 是 False |
loadProgress(int) | 加载网页元素时发送信号,参数的范数是0~100 |
loadStarted() | 开始加载网页时发送信号 |
pdfPrintingFinished(filePath: str,success:bool) | 打印成pdf文件结束时发送信号 |
printFinished(success:bool) | 打印完成时发送信号 |
printRequested() | 请求打印时发送信号 |
selectionChanged() | 网页中选择的内容发生改变时发送信号 |
titleChanged(title:str) | 网页标题名称发生改变时发送信号 |
网页浏览器控件的应用实例
下面的程序创建一个简单的浏览器,用QWebEngineView 类创建子类myWebView,并重写了createWindow()函数这样在单击 QWebEnginePage,WebBrowserTab(浏览器切换卡)类型的链接时能够显示链接的内容如果是非QWebEnginePage WebBrowserTab 类型的链接,则根据浏览记录可以向前和向后导航。
# -*- coding: UTF-8 -*-
# File date: Hi_2023/3/3 12:57
# File_name: 01-网页浏览器控件的应用实例.py.py
import sys
from PySide6.QtWidgets import QApplication,QWidget,QLabel,QPushButton,QLineEdit,QHBoxLayout,QVBoxLayout,QTabWidget,QProgressBar
from PySide6.QtWebEngineWidgets import QWebEngineView
from PySide6.QtCore import QUrl,Qt
from PySide6.QtGui import QIcon
class WidgetInTab(QWidget):
# 切换卡中的控件 # 参数tab用于切换卡控件的传递
def __init__(self,parent=None,tab=None):
super().__init__(parent)
self.tab = tab
self.urlLabel = QLabel("网址(&D):")
self.urlLine = QLineEdit()# 地址栏
self.urlLabel.setBuddy(self.urlLine)
self.backBtn = QPushButton(icon=QIcon("../../../Resources/Icons/FlatIcon-regular-rounded/arrow-small-left.png"))# 后退按钮
self.forwardBtn = QPushButton(icon=QIcon("../../../Resources/Icons/FlatIcon-regular-rounded/arrow-small-right.png"))# 前进按钮
self.reloadBtn = QPushButton(icon=QIcon("../../../Resources/Icons/FlatIcon-regular-rounded/refresh.png"))# 重新加载按钮
self.homeBtn = self.homeBtn = QPushButton(icon=QIcon("../../../Resources/Icons/FlatIcon-regular-rounded/home.png"))# 主页按钮
self.webView = self.webView = QWebEngineView()# 浏览器控件
self.webPage = self.webView.page()# 浏览器内部的网页
self.history = self.webPage.history()# 网页上的历史记录
self.progressBar = QProgressBar()# 进度条控件
self.progressBar.setRange(0,100)# 进度条
self.progressBar.setAlignment(Qt.AlignCenter)
self.progressBar.setFormat("加载中,已完成%p%")
self.homeAddress ="https://www.sohu.com"# 主页地址
self.webPage.setUrl(self.homeAddress)
H = QHBoxLayout()# 水平布局
H.addWidget(self.urlLabel)
H.addWidget(self.urlLine)
H.addWidget(self.backBtn)
H.addWidget(self.forwardBtn)
H.addWidget(self.reloadBtn)
H.addWidget(self.homeBtn)
V = QVBoxLayout(self)# 竖直布局
V.addLayout(H)
V.addWidget(self.webView)
V.addWidget(self.progressBar)# 布局添加控件
# 信号与槽函数的连接
self.urlLine.returnPressed.connect(self.urlLine_returnPressed)
self.webPage.urlChanged.connect(self.url_changed)
self.webPage.titleChanged.connect(self.title_changed)
self.webPage.iconChanged.connect(self.icon_changed)
self.webPage.newWindowRequested.connect(self.new_WindowRequested)
self.forwardBtn.clicked.connect(self.forwardBtn_clicked)
self.backBtn.clicked.connect(self.backBtn_clicked)
self.reloadBtn.clicked.connect(self.webView.reload)
self.homeBtn.clicked.connect(self.homeBtn_clicked)
self.webPage.loadProgress.connect(self.progressBar.setValue)
self.webPage.loadFinished.connect(self.load_finished)
self.webPage.loadStarted.connect(self.load_started)
def urlLine_returnPressed(self): # 输人新地址并按Enter键后的槽函数
url = QUrl.fromUserInput(self.urlLine.text())
if url.isValid():
self.webPage.load(url)# 加载网页
def url_changed(self,url): # URL地址发生变化时的槽函数
self.urlLine.setText(url.toString())# 显示新的地址
self.backBtn.setEnabled(self.history.canGoBack())
self.forwardBtn.setEnabled(self.history.canGoForward())
def title_changed(self,title): # 网页地址发生变化时的槽函数
tab_index = self.tab.indexOf(self)# 获取当前页的索引
self.tab.setTabText(tab_index,title)
def icon_changed(self,icon): # 网页图标发生变化时的槽函数
tab_index = self.tab.indexOf(self)
self.tab.setTabIcon(tab_index,icon)
def new_WindowRequested(self,request): # 需要新网页时的槽函数
tab_index = self.tab.indexOf(self)
newWindow = WidgetInTab(parent=None,tab=self.tab)# 创建切换卡内部的控件
self.tab.insertTab(tab_index + 1,newWindow,'加载中...')# 插入新卡片
self.tab.setCurrentIndex(tab_index + 1)# 将新插入的卡片作为当前卡片
newWindow.webPage.load(request.requestedUrl())# 加载新网页
def load_started(self): # 网页开始加载时的槽函数
self.progressBar.show()
def load_finished(self,ok): # 网页加载结束时的槽函数
self.progressBar.hide()
def backBtn_clicked(self): # 后退按钮的槽函数
self.history.back()
if not self.history.canGoBack():
self.backBtn.setEnabled(False)
def forwardBtn_clicked(self): # 前进按钮的槽函数
self.history.forward()
if not self.history.canGoForward():
self.forwardBtn.setEnabled(False)
def homeBtn_clicked(self): # 主页按钮的槽函数
self.webPage.load(self.homeAddress)
class MyWindow(QWidget): # 主窗口
def __init__(self,parent=None):
super().__init__(parent)
self.setWindowTitle("QWebEnginePage的应用实例")
self.resize(800,600)
self.setupUi()
def setupUi(self):
self.tab = QTabWidget()# 切换卡控件
self.tab.setTabsClosable(True)
self.tab.setElideMode(Qt.TextElideMode.ElideMiddle)
H = QHBoxLayout(self)
H.addWidget(self.tab)
firstTab = WidgetInTab(parent=None,tab=self.tab)
self.tab.addTab(firstTab,firstTab.webPage.title())# 第一个卡片中的内容
self.tab.tabCloseRequested.connect(self.tab_closeRequested)
def tab_closeRequested(self,index):
if self.tab.count()> 1:
self.tab.removeTab(index)
if __name__ =='__main__':
app = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec())
网页QWebEnginePage
网页QWebEnginePage 是指网页浏览器控件QWebEngineView中的网页内容。
- 用QWebEngineView 的page()方法可以取QWebEnginePage,
- 用setPage(page:QWebEnginePage)方法可以给浏览器控件设置网页。
用QWebEnginePage创建网页实例的方法如下所示,其中参数 profile 是对网页的设置、脚本、缓存地址、cookie 的保存策略等。QWebEnginePage 继承自QObject。
from PySide6.QtWebEngineWidgets import QWebEngineView
QWebEngineView(page: PySide6.QtWebEngineCore.QWebEnginePage,parent: Union[PySide6.QtWidgets.QWidget,NoneType]= None)-> None
QWebEngineView(parent: Union[PySide6.QtWidgets.QWidget,NoneType]= None)-> None
QWebEngineView(profile: PySide6.QtWebEngineCore.QWebEngineProfile,parent: Union[PySide6.QtWidgets.QWidget,NoneType]= None)-> None
网页QWebEnginePage的常用方法
网页QWebEnginePage 的常用方法如表所示,主要方法介绍如下
-
用setUrl(url:Union[QUrl,str])方法或 load(url:Union[QUrl,str])方法设置网页地址;用requestedUrl()方法或 url()方法获取当前网页的地址
-
重写createWindow(QWebEnginePageWebWindowType)函数单击链接后需要产生新网页时可以创建新的网页如果不重写该函数或者返回值不是QWebEnginePage对象,将发送newWindowRequested()信号;
-
重写acceptNavigationRequest(url:Union[QUrl;str],QWebEnginePage.NavigationType;isMainFrame:bool)函数方法可以设置导航到新地址的处理方式其中枚举值QWebEnginePageNavigationType确定导航的原因可取:
- QWebEnginePage,NavigationTypeLinkClicked(单击链接)
- QWebEnginePageNavigationTypeTyped(加载)
- QWebEnginePage NavigationTypeFormSubmitted(表格提交)
- QWebEnginePageNavigationTypeBackForward(前进或后退动作)
- QWebEnginePageNavigationTypeReload(重新加载)
- QWebEnginePage.avigationTypeRedirect(目录或服务器重新定位或自动重新加载)
- QWebEnginePageNavigationTypeOther(除以上方式之外的其他方式)
-
用findText(str,QWebEnginePage.FindFlags,function(QWebEngineFindTextResult))方法
- 可以在网页中查找指定的文本,查找结束后会发送indTextFinished(QWebEngineFindTextResult)信号和调用function(QWebEngineFindTextResult)函数,
- 参数QWebEngineFindTextResult 是查找后的结果对象,其有两个方法numberOfMatches()和 activeMatch(),分别获取匹配的个数和当前匹配的索引;
- 参数QWebEnginePage.FindFlags 设置查找方向,可以取(默认向前查找和大小写不敏感。):
- QWebEnginePage.FindBackward(向后查找)
- QWebEnginePage.FindCaseSensitively(大小写敏感)
- 可以在网页中查找指定的文本,查找结束后会发送indTextFinished(QWebEngineFindTextResult)信号和调用function(QWebEngineFindTextResult)函数,
-
用setFeaturePermission(securityOrigin; Union[QUrl,str],feature:QWebEnginePage,Feature,policy;QWebEnginePage.PermissionPolicy)方法可以给网页需要的一些设备进行权限设置
-
其中参数 feature 是QWebEnginePage.Feature枚举值,可取值如表所示:
QWebEnginePage.Feature的取值 值 说 明 QWebEnginePage.notifications 0 网站通知最终用户 QWebEnginePage.Geolocation 1 当地硬件或服务 QWebEnginePage.MediaAudioCapture 2 音频设备.如麦克风 QWebEnginePage.MediaVideoCapture 3 视频设备.如摄像头 QWebEnginePage.MediaAudioVideoCapture 4 音频和视频设备 QWebEnginePage.MouseLock 5 将光标锁定在浏览器中.通常用于游戏中 QWebEnginePage.DesktopVideoCapture 6 视频输出.如多人可共享桌面 QWebEnginePage.DesktopAudioVideoCapture 7 视频和音频输出 -
policy设置权限可取:
- QWebEnginePagePermissionUnknown(不确定是否已经用户授权)
- QWebEnginePage.PermissionGrantedByUser(用户已经授权)
- QWebEnginePage.PermissionDeniedByUser(用户已经拒绝)
-
-
网页中有一些默认的动作,由动作构成右键快捷菜单,有关动作的内容参见动作节,网页中的动作由 action(action:QWebEnginePage.WebAction)方法获取,其中放举值QWebEnginePage.WebAction 可取值如表所示:
-
用triggerAction(action:QWebEnginePage,WebAction,checked;bool=False)方法可以激发某个动作
-
使用 QWebEnginePage.action()函数可以获取操作对应的 action(QWebEngineView.pageAction()函数可以提供相同的功能)
-
使用QWebEnginePage.isEnabled0函数可以确定操作的可用性。使用 QWebEngineView.triggerPageAction0函数或QWebEnginePage. triggerAction0函数可以触发这些操作,代码如下:
self.webEngineView.triggerPageAction(QWebEnginePage.Back) self.webEngineView.page().triggerAction(QWebEnginePage.Forward)
-
操作方法 | 值 | 描述 |
---|---|---|
QWebEnginePage.NoWebAction | -1 | 不会触发任何操作 |
QWebEnginePage.Back | 0 | 在导航链接的历史记录中向后导航 |
QWebEnginePage.Forward | 1 | 在导航链接的历史记录中向前导航 |
QWebEnginePage.Stop | 2 | 停止加载当前页面 |
QWebEnginePage.Reload | 3 | 重新加载当前页面 |
QWebEnginePage.ReloadAndBypassCache | 10 | 重新加载当前页面,但不要使用任何本地缓存 |
QWebEnginePage.Cut | 4 | 将当前选中的内容剪切到剪贴板中 |
QWebEnginePage.Copy | 5 | 将当前选择的内容复制到剪贴板中 |
QWebEnginePage.Paste | 6 | 从剪贴板中粘贴内容 |
QWebEnginePage.Undo | 7 | 撤销上一个编辑操作 |
QWebEnginePage.Redo | 8 | 重做最后的编辑动作 |
QWebEnginePage.SelectAll | 9 | 选择所有内容。此操作仅在页面内容获得焦点时启用。可以通过调用JavaScriptwindow.focusO函数来获取焦点,或者启用FocusOnNavigationEnabled设置以自动获取焦点 |
QWebEnginePage.PasteAndMatchStyle | 11 | 使用当前样式粘贴剪贴板中的内容 |
QWebEnginePage.OpenLinkInThisWindow | 12 | 在当前窗口中打开当前链接(在Qt5.6中添加) |
QWebEnginePage.OpenLinkInNewWindow | 13 | 在新窗口中打开当前链接,需要实现createWindowO函数或newWindowRequestedO函数(Qt5.6中添加) |
QWebEnginePage.OpenLinkInNewTab | 14 | 在新选项卡中打开当前链接,需要实现createWindowO函数或newWindowRequestedO函数(在Qt5.6中添加) |
QWebEnginePage.OpenLinkInNewBackgroundTab | 31 | 在新的背景选项卡中打开当前链接,需要实现createWindow0函数或newWindowRequestedO函数(在Qt5.7中添加) |
QWebEnginePage.CopyLinkToClipboard | 15 | 将当前链接复制到剪贴板中(在Qt5.6中添加) |
QWebEnginePage.CopyImageToClipboard | 17 | 将单击的图像复制到剪贴板中(在Qt5.6中添加) |
QWebEnginePage.CopyImageUrlToClipboard | 18 | 将单击的图像的URL复制到剪贴板中(在Qt5.6中添加) |
QWebEnginePage.CopyMediaUrlToClipboard | 20 | 将悬停的音频或视频的URL复制到剪贴板中(在Qt5.6中添加) |
QWebEnginePage.ToggleMediaControls | 21 | 在显示和隐藏悬停的音频或视频元素的控件之间切换(在Qt5.6中添加) |
QWebEnginePage.ToggleMediaLoop | 22 | 切换悬停的音频或视频是否应在完成时循环播放(在Qt5.6中添加) |
QWebEnginePage.ToggleMediaPlayPause | 23 | 切换悬停的音频或视频元素的播放/暂停状态(在Qt5.6中添加) |
QWebEnginePage.ToggleMediaMute | 24 | 将悬停的音频或视频元素静音或取消静音(在Qt5.6中添加) |
QWcbEnginePage.DownloadLinkToDisk | 16 | 将当前链接下载到磁盘中,需要一个用于函数downloadRequestedO的插槽(在Qt5.6中添加) |
QWcbEnginePage.DownloadImageToDisk | 19 | 将突出显示的图像下载到磁盘中,需要一个用于函数downloadRequested0的插槽(在Qt5.6中添加) |
QWebEnginePage.DownloadMediaToDisk | 25 | 将悬停的音频或视频下载到磁盘中,需要一个用于函数downloadRequestedO的插槽(在Qt5.6中添加) |
QWebEnginePage.1nspectElement | 26 | 触发任何附加的WebInspector以检查突出显示的元素(在Qt5.6中添加) |
QWebEnginePage.ExitFullScreen | 27 | 退出全屏模式(在Qt5.6中添加) |
QWebEnginePage.RequestClose | 28 | 请求关闭网页。如果已定义,则window.onbeforeunload运行处理程序,并且用户可以确认或拒绝关闭页面。如果关闭请求被确认,则发出windowCloseRequested(在Qt5.6中添加) |
QWebEnginePage.Unselect | 29 | 清除当前选择(在Qt5.7中添加) |
QWebEnginePage.SavePage | 30 | 将当前页面保存到磁盘中。MHTML是将网页存储在磁盘中的默认格式。需要一个用于函数downloadRequestedO的插槽(在Qt5.7中添加) |
QWebEnginePage.ViewSource | 32 | 在新选项卡中显示当前页面的来源,需要实现函数createWindow0或newWindowRequested0(在Qt5.8中添加) |
QWebEnginePage.ToggleBold | 33 | 切换所选内容或指针位置的粗体,需要contenteditable=“true”(在Qt5.10中添加) |
QWebEnginePage.ToggleItalic | 34 | 在选择的位置或指针位置切换斜体,需要contenteditable=“true”(在Qt5.10中添加) |
QWebEnginePage.ToggleUnderline | 35 | 切换选择的下画线或指针位置,需要contenteditable=“true”(在Qt5.10中添加) |
QWebEnginePage.ToggleStrikethrough | 36 | 在选择的位置或指针位置切换,需要contenteditable=“true”(在Qt5.10中添加) |
QW&bEnginePage.AlignLefR | 37 | 将包含所选内容或指针位置的行向左对齐,需要contenteditable=“true”(在Qt5.10中添加) |
QWebEnginePage.AlignCenter | 38 | 将包含所选内容或指针位置的行居中对齐,需要contenteditable=“true”(在Qt5.10中添加) |
QWebEnginePage.AlignRight | 39 | 将包含所选内容或指针位置的行向右对齐,需要contenteditable=“true”(在Qt5.10中添加) |
QWebEnginePage.Alignustified | 40 | 拉伸包含所选内容或指针位置的行,使每行的宽度相等,需要contenteditable=“true”(在Qt5.10中添加) |
QWebEnginePage.Indent | 41 | 缩进包含选择或指针位置的行,需要contenteditable=“true”(在Qt5.10中添加) |
QWebEnginePage.Ouden | 42 | 使包含选择或指针位置的行缩进,需要contenteditable=“true”(在Qt5.10中添加) |
QWebEnginePage.InsertOrderedList | 43 | 在当前指针位置插入一个有序列表,删除当前选择,需要contenteditable=“true”(在Qt5.10中添加) |
QWebEnginePage.InsertUnorderedList | 44 | 在当前指针位置插入一个无序列表,删除当前选择,需要contenteditable=“true”(在Qt5.10中添加) |
-
用chooseFiles(QWebEnginePage.FileSelectionMode,oldFiles: Sequence[str])方法设置网页中选择文件时(如上传文件)的文件选择模式,其中QWebEnginePage.FileSelectionMode枚举值可取以下值;oldFiles 是提供建议的文件名前半部分。
- QWebEnginePage.FileSelectOpen(只能选择一个文件)
- QWebEnginePage.FileSelectOpenMultiple(可选多个文件)
- QWebEnginePage FileSelectUploadFolder(选择文件夹);
-
用save(filePath:str,format: QWebEngineDownloadRequest,SavePageFormat)方法保存网页内容到指定文件,其中参数format设置文件格式,可取:
- QWebEngineDownloadRequest.UnknownSaveFormat
- QWebEngineDownloadRequest.SingleHtmlSaveFormat(保存到一个HTML文件中,有些信息如图片不保持)
- QWebEngineDownloadRequest,CompleteHtmlSaveFormat(保存整个 HTML文件,有些信息如图片保存到文件夹中)
- QWebEngineDownloadRequest,MimeHtmlSaveFormat(保存成MIMEHTML格式)
-
执行js脚本
-
QWebEnginePage.runJavaScript()函数对运行JavaScript代码提供支持,如支持回调函数,有两种使用方式,如下所示:
runJavaScript(self,arg__1: str,arg__2: int,arg__3: object)-> None runJavaScript(self,scriptSource: str,worldId: int = 0)-> None
第1种方式支持回调函数(arg_3),会把 JavaScript 代码返回的结果传递给回调函数。
前两个参数(arg1 和(arg2)分别是 scriptSource 和 worldld,和第 2 种方法的参数相同。
scriptSource 是脚本源文件,worldld 定义了脚本的执行范围。worldld 支持的项目如表所示,如果要求不高则使用默认0即可。
项 目 值 描述 QWebEngineScript.MainWorld 0 页面的Web 内容使用的世界。在某些情况下,它可以用于向 Web 内容公开自定义功能 QWebEngineScript.ApplicationWorld 1 用于在JavaScript中实现的应用程序级功能的默认隔离世界 QWebEngineScript.UserWorld 2 如果应用程序不使用更多的世界,则用户设置的脚本将使用第一 个孤立世界。一般来说,如果该功能向应用程序的用户公开,则每个 单独的脚本都应该有自己的独立世界
-
QWebEnginePage的方法及参数类型 | 返回值的类型 | 说明 |
---|---|---|
setUrl(url: Union[QUrl,str]) | None | 加载指定的网页地址 |
load(url: Union[QUrl,str]) | None | 加载QUrl地址网页 |
load(request: QWebEngineHttpRequest) | None | 加载特定的网页 |
requestedUrl() | QUrI | 获取当前网页的地址 |
url() | QUrI | 获取当前网页的地址 |
isLoading() | bool | 获取网页是否在加载 |
createWindow(QWebEnginePage.WebWindowType) | QWebEnginePage | 重写该方法创建新网页 |
acceptNavigationRequest(url: Union[QUrl,str],QWebEnginePage.NavigationType,isMainFrame:bool) | bool | 重写该函数,设置导航到新地 址的处理方式 |
setFeaturePermission(securityOrigin:Union[QUr1,str],feature:QWebEnginePage.Feature,policy: QWebEnginePage.PermissionPolicy) | None | 给网页需要的设备进行权限 设置 |
setUrlRequestInterceptor(interceptor: QWebEngineUrlRequestInterceptor) | None | 设置拦截器 |
action(action: QWebEnginePage.WebAction) | QAction | 获取网页的指定动作,用于创 建右键快捷菜单 |
triggerAction(action: QWebEnginePage.WebAction,checked: bool=False) | None | 执行指定的动作 |
setBackgroundColor(color:Union[QColor,Qt.GlobalColor,str]) | None | 设置背景颜色 |
backgroundColor() | QColor | 获取网页背景颜色 |
contentsSize() | QSizeF | 获取网页内容的尺寸 |
setDevToolsPage(page:QWebEnginePage) | None | 设置开发者工具 |
devToolsPage() | QWebEnginePage | 获取开发工具网页 |
download(url: Union[QUrl,str].filename:str=‘’) | None | 下载资源到文件中 |
findText(str:QWebEnginePage FindFlags,function(QWebEngineFindTextResult)) | None | 调用指定的函数查找,函数参 数是查找结果 |
findText(subString: str,QWebEnginePage.FindFlags=}) | None | 查找指定的内容 |
hasSelection() | bool | 获取是否有选中的内容 |
history() | QWebEngineHistory | 获取历史导航 |
icon() | QIcon | 获取网页的图标 |
iconUrl() | QUrI | 获取网页的地址 |
title() | str | 获取网页标题 |
chooseFiles(QWebEnginePage.FileSelectionMode,oldFiles: Sequence[str]) | ListCstr] | 设置选择文件时(如上传文 件),文件选择模式 |
setAudioMuted(muted: bool) | None | 设置网页静音状态 |
isAudioMuted() | bool | 获取是否处于静音状态 |
setVisible(visible:bool) | None | 设置网页是否可见 |
isVisible() | bool | 获取网页是否可见 |
printToPdf(filePath:str) | None | 将网页转换成 pdl 文档 |
profile() | QWebEngineProfile | 获取 QWebEngineProile |
recentlyAudible() | bool | 获取是否播放过音频 |
renderProcessPid() | int | 获取渲染进度 |
replaceMisspelledWord(replacement: str) | None | 用指定的文本替换不能识别的 文本 |
runJavaScript(scriptSource: str,worldId:int= 0,function(any)) | None | 运行 Java 脚本 |
runJavaScript(seriptSource: str,function(any)) | None | 运行 Java 脚本 |
save(filePath: str,format: QWebEngineDownloadRequest SavePageFormat) | None | 保存网页内容到文件中 |
scrollPosition() | QPointF | 获取网页滚动的位置 |
selectedText() | str | 获取网页上选中的文本 |
setHtml(html: str,baseUrl: Union[QUrl,str]) | None | 显示HTML文档内容 |
setWebChannel(QWebChannel,worldId:int=0) | None | 设置网络通道 |
webChannel() | QWebChannel | 获取当前的网络通道 |
setZoomFactor(factor:float) | None | 设置缩放系数 |
zoomFactor() | float | 获取当前的缩放系数 |
settings() | QWebEngineSettings | 获取对网页的设置 |
网页QWebEnginePage 的信号
网页QWebEnginePage的信号如表所示,主要信号介绍如下
-
当网页的QUrl地址发生改变时,发送urChanged(QUrl)信号开始加载网页内容时发送loadStarted()信号;
- 加载过程中发送 loadProgress(int)参数的值是加载进度取值范围是0~100;
- 加载结束时发送 loadFinished(bool)信号,如果加载成功则参数是 True。
-
网页加载发生改变时发送 loadingChanged(QWebEngineLoadingInfo)信号;
-
其中QWebEngineLoadingInfo记录加载过程信息,用QWebEngineLoadingInfo 的 url()方法获取加载网页的QUrl 地址;
-
用isErrorPage()方法判断加载过程是否出错;
-
status()方法获取加载状态,返回值可能是以下值,对应的值分别是0~3:
- QWebEngineLoadingInfoLoadStartedStatus(加载开始)
- QWebEngineLoadingInfo.LoadStoppedStatus(加载停止)
- QWebEngineLoadingInfo,LoadSucceededStatus(加载成功)
- QWebEngineLoadingInfo.LoadFailedStatus(加载失败)
- 如果加载失败,可以用errorDomain()方法获取失败类型返值可能是以下值,对应的值分别是0~6:
- QWebEngineLoadingInfo.NoErrorDomain(出错类型未知)
- QWebEngineLoadingInfoInternalErrorDomain(内容不能被 PySide识别)
- QWebEngineLoadingInfoConnectionErrorDomain(网络连接出错)
- QWebEngineLoadingInfo CertificateErrorDomain(证书出错)
- QWebEngineLoadingInfo.HttpErrorDomain(HTTP连接出错)
- QWebEngineLoadingInfo.FtpErrorDomain(FTE连接出错)
- QWebEngineLoadingInfo.DnsErrorDomain(DNS 连接出错)
-
-
当网页中视频播放器需要全屏显示时发送ullScreenRequested(QWebEngineFullScreenRequest)信号,信号的参数是 QWebEngineFullScreenRequest 对象
- 可以用QWebEngineFullScreenRequest 对象的accept()方法接受全屏模式;用reject()方法放弃全屏模式;
- 如果 toggleOn()方法的返回值是True,则表示处于全屏状态
- 另外用origin()方法获取全屏状态时的 QUrl地址。
-
网页上需要输人授权(用户名和密码)时发送authenticationRequired(QUrl,QAuthenticator)信号
- 其中QUrl是需要授权的网页地址
- QAuthenticator 用于记录用户名和密码的类
- 可以用setUser(str)和 setPassWord(str)方法分别设置用户名和密码
- 用user()和 password()方法获取用户名和密码
-
需要设备授权时发送featurePermissionRequested(QUrl,QWebEnginePage Feature)信号
- 设备使用完不再需要设备授权时发送 featurePermissionRequestCanceled(QUrl,QWebEnginePageFeature)信号。
-
在网页上搜索文本,搜索完成时发送 findTextFinished(QWebEngineFindTextResult)信号
- 其中QWebEngineFindTextResult 记录查询到的与目标匹配的结果的个数和当前匹配的索引。
- 用QWebEngineFindTextResult 的 nuberOfMatches()方法获取匹配的个数用activeMatch()方法获取当前匹配的索引。
- 其中QWebEngineFindTextResult 记录查询到的与目标匹配的结果的个数和当前匹配的索引。
-
调用acceptNavigationRequest()方法时发送 navigationRequested(QWebEngineNavigationRequest)信号
- 利用QWehEngineNavigationRequest 的accept()或 reject()方法可以接受或拒绝导航到指定网页;
- 用url()方法获取要导航到的网页地址。
-
需要在另外一个窗口中加载新网页时发送newWindowRequested(QWebEngineNewWindowRequest)信号,如果用户重写了 createWindow()函数则不会发送该信号。
- QWebEngineNewWindowRequest 的openIn(QWebEnginePage)方法指定在哪个网页中打开;
- isUserInitiated()方法获取是否由用户(键盘或鼠标事件)引起requestedUrl()方法取新网页的 QUrl 地址
- requestedGeometry()方法获取新网页的尺寸QRect;
- destination()方法获取新网页的类型,返回值是枚举类型QWebEngineNewWindowRequest,DestinationType可取以下值,对应的值分别是0~3。:
- QWebEngineNewWindowRequest.InNewWindow(新窗口中)
- QWebEngineNewWindowRequest,InNewTab(同窗的切换卡中)
- QWebEngineNewWindowRequest,InNewDialog(在没有切换卡、工具栏和 URL输人框的新窗口中)
- QWebEngineNewWindowRequest.InNewBackgroundTab(在同一个窗口中,没有隐藏当前可见的浏览器)
-
需要获取比应用程序分配的更大存储空间时发送quotaRequested(QWebEngineQuotaRequest)信号
- 用QWebEngineQuotaRequest 的 accept()方法或reject()方法接受请求或拒绝请求;
- 用requestedSize()方法获取需要的存储空间(单位是 B);
- 用origin()方法获取发出请求的网页地址 QUrl。
-
选择客户证书时发送 selectClientCertificate(QWebEngineClientCertificateSelection)信号
- 用QWebEngineClientCertificateSelection 的 certificates()方法获取可选的证书列表List[QSslCertificate];
- 用select(QSslCertificate)方法选择一个证书;
- 用selectNone()方法不选择任何证书继续加载网页;
- 用host()方法获取需要客户证书的服务器的地址 QUrI(主机名和端口)。
-
渲染非正常中断时发送renderProcessTerminated(QWebEnginePage.RenderProcessTerminationStatus,exitCode:int)信号,举值QWebEnginePage.RenderProcessTerminationStatus 可取以下值,分别对应0~3:
- QWebEnginePage NormalTerminationStatus
- QWebEnginePage AbnormalTerminationStatus
- QWebEnginePage.CrashedTerminationStatus
- QWebEnginePage KilledTerminationStatus
QWebEnginePage 的信号及参数类型 | 说明 |
---|---|
urlChanged(QUrl) | 网页地址发生改变时发送信号 |
selectionChanged() | 网页所选内容发生改变时发送信号 |
iconChanged(QIcon) | 网页图标发生改变时发送信号 |
iconUrlChanged(QUrl) | 网页图标的地址发生改变时发送信号 |
titleChanged(str) | 网页标题发生改变时发送信号 |
visibleChanged(bool) | 可见性发生改变时发送信号 |
contentsSizeChanged(QSizeF) | 网页的尺寸发生改变时发送信号 |
geometryChangeRequested(QRect) | 网页位置和尺寸发生改变时发送信号 |
fullScreenRequested(QWebEngineFullScreenRequest) | 全屏显示时(如播放视频)发送信号 |
windowCloseRequested() | 需要关闭窗口时发送信号 |
audioMutedChanged(bool) | 网页静音状态发生改变时发送信号 |
scrollPositionChanged(QPointF) | 滚动位置发生改变时发送信号 |
linkHovered(str) | 光标移到网页中的链接时发送信号 |
new WindowRequested(QWebEngineNewWindowRequest) | 在另一个窗口中加载新网页时发送信号 |
authenticationRequired(QUrl,QAuthenticator) | 网页上需要输人授权(用户名和密码)时发送信号 |
certificateError(QWebEngineCertificateError) | 证书出错时发送信号 |
featurePermissionRequested(QUrl; QWebEnginePage,Feature) | 需要设备授权时发送信号 |
featurePermissionRequestCanceled(QUrl,QWebEnginePage.Feature) | 不再需要设备授权时发送信号 |
findTextFinished(QWebEngineFindTextResult) | 查找结束时发送信号 |
loadStarted() | 开始加载网页内容时发送信号 |
loadProgress(int) | 加载过程中发送信号,参数值的范围是0~100 |
loadFinished(bool) | 加载结束时发送信号 |
loadingChanged(QWebEngineLoadingInfo) | 加载发生改变时发送信号 |
navigationRequested(QWebEngineNavigationRequest) | 调用acceptNavigationRequest()方法时发送信号 |
pdfPrintingFinished(filePath: str,success: bool) | 转换完pdf格式文档时发送信号 |
proxyAuthenticationRequired(QUrl,QAuthenticator,proxyHost: str) | 需要代理授权时发送信号 |
quotaRequested(QWebEngineQuotaRequest) | 需要获取比应用程序分配的更大存储空间时发送信号 |
recentlyAudibleChanged(recentlyAudible:bool) | 静音状态发生改变时发送信号 |
renderProcessPidChanged(int) | 渲染过程发生改变时发送信号 |
renderProcessTerminated(QWebEnginePage.RenderProcessTerminationStatus,exitCode: int) | 渲染非正常中断时发送信号 |
selectClientCertificate(QWebEngineClientCertificateSelection) | 选择客户证书时发送信号 |
QWebEngineHistory 与 QWebEngineHistoryltem
每个网页都会有一个QWebEngineHistory 对象
- QWebEngineHistory 对象由多个历史记录构成,每个历史记录称为QWebEngineHistoryItem(历史项),
- QWebEngineHistorylItem 项用于记录曾经访问过的QUrl地址和访问时间。
用QWebEnginePage 或 QWebEngineView的 history()方法可以获得网页的 QWebEngineHistory 对象。
网页加载的内容是当前历史项记录的网址,如果当前历史项发生改变,则网页加载的内容也同时改变。
当前历史项将 QWebEngineHistory 中的历史项分为之前的历史项和之后的历史项。
- 用QWebEngineHistory 的 currentItem()方法和currentItemIndex()方法可以分别获取当前的历史项和历史项的索引;
- 用back()方法和 forward)方法可以分别将当前项之前的历史项或之后的历史项作为当前历史项,网页也同时跳转,网页也同时跳转,
- 用gotoItem(QWebEngineHistoryItem)方法可以将指定的历史项作为当前项,网页也同时跳转;
- 用canGoBack()方法或canGoForward()方法可以判断当前项之前或之后是否有历史项,如果有,则可以后退或前进;
- 用QWebEngineHistoryItem 的 url()方法可以获取历史项关联的网址;
- 用lastVisited()方法获取历史项关联的网页最后访问日期和时间。
QWebEngineHistory常用方法如表所示
QWebEngineHistory的方法 | 返回值的类型 | 说明 |
---|---|---|
currentItem() | QWebEngineHistoryItem | 获取当前的历史项 |
currentItemIndex() | int | 获取当前历史项的索引 |
back() | None | 将当前项之前的历史项作为当前项,网页也同时后退 |
forward() | None | 将当前项之后的历史项作为当前项,网页也同时前进 |
gotoItem(QWebEngineHistoryltem) | None | 将指定的历史项作为当前项,网页也同时跳转 |
backItem() | QWebEngineHistoryItem | 获取当前项之前的历史项 |
backItems(maxItems:int) | List[QWebEngineHistoryItem] | 获取当前项之前的最多maxItems个历史项 |
forwardItem() | QWebEngineHistoryItem | 获取当前项之后的历史项 |
forwardItems(maxItems:int) | List[QWebEngineHistoryItemJ | 获取当前项之后的最多maxItems个历史项 |
canGoBack() | bool | 获取是否可以后退 |
canGoForward() | bool | 获取是否可以前进 |
itemAt(i:int) | QWebEngineHistoryltem | 根据索引获取历史项 |
items() | List[QWebEngineHistoryItem] | 获取所有的历史项 |
count() | int | 获取记录的历史项的个数 |
clear() | None | 清空所有记录 |
QWebEngineHistoryItem常用方法如表所示
QWebEngineHistoryItem的方法 | 返回值的类型 | 说明 |
---|---|---|
url() | QUrl | 获取历史项关联的网址 |
title() | Str | 获取历史项关联的网页的标题 |
lastVisited() | QDateTime | 获取历史项关联的网页最后访问日期和时间 |
iconUrl() | QUrI | 获取历史项关联的图标的网址 |
isValid() | bool | 获取历史项是否有效 |
originalUrl() | QUrI | 获取历史项关联的初始网址 |
QWebEnginePage 和 QWebEngineHistory 的应用实例
下面程序建立一个复杂些的网站浏览器,将浏览器放到切换卡控件中,在需要弹出窗口时自己添加卡片;可以进行页面的前进、后退导航,可以显示加载页面的进度
# -*- coding: UTF-8 -*-
# File date: Hi_2023/3/3 12:56
# File_name: 02-QWebEnginePage 和 QWebEngineHistory的应用实例.py
from PySide6.QtWidgets import QApplication,QWidget,QLabel,QPushButton,QLineEdit,QHBoxLayout,QVBoxLayout
from PySide6.QtWebEngineWidgets import QWebEngineView
from PySide6.QtCore import QUrl
from PySide6.QtGui import QIcon
import sys
class myWebView(QWebEngineView): # 创建QWebEngineView的子类
def __init__(self,parent=None):
super().__init__(parent)
def createwindow(self,type): # 重写 createWindow()函数
return self
class MyWindow(QWidget):
def __init__(self,parent=None):
super().__init__(parent)
self.setWindowTitle("QWebEngineView的应用实例")
self.resize(800,600)
self.setupUi()
def setupUi(self):
self.urlLabel = QLabel("网址(&D):")
self.urlLine = QLineEdit()# 地址栏
self.urlLabel.setBuddy(self.urlLine)
self.backBtn = QPushButton(icon=QIcon("../../../Resources/Icons/FlatIcon-regular-rounded/arrow-small-left.png"))# 后退按钮
self.forwardBtn = QPushButton(icon=QIcon("../../../Resources/Icons/FlatIcon-regular-rounded/arrow-small-right.png"))# 前进按钮
self.reloadBtn = QPushButton(icon=QIcon("../../../Resources/Icons/FlatIcon-regular-rounded/refresh.png"))# 重新加载按钮
self.homeBtn = self.homeBtn = QPushButton(icon=QIcon("../../../Resources/Icons/FlatIcon-regular-rounded/home.png"))# 主页按钮
self.webEngineView = myWebView()# 用QWebEngineView的子类创建浏览器
self.homeAddress ="https://www.sohu.com"# 主页地址
self.webEngineView.setUrl(self.homeAddress)
H = QHBoxLayout()
H.addWidget(self.urlLabel)
H.addWidget(self.urlLine)
H.addWidget(self.backBtn)
H.addWidget(self.forwardBtn)
H.addWidget(self.reloadBtn)
H.addWidget(self.homeBtn)
V = QVBoxLayout(self)
V.addLayout(H)
V.addWidget(self.webEngineView)
self.urlLine.returnPressed.connect(self.urlLine_return_Pressed)
self.webEngineView.titleChanged.connect(self.setWindowTitle)
self.webEngineView.urlChanged.connect(self.urChanged)
self.webEngineView.iconChanged.connect(self.setWindowIcon)
self.forwardBtn.clicked.connect(self.webEngineView.forward)
self.backBtn.clicked.connect(self.webEngineView.back)
self.reloadBtn.clicked.connect(self.webEngineView.reload)
self.homeBtn.clicked.connect(self.homeBtn_clicked)
def urlLine_return_Pressed(self):
url = QUrl.fromUserInput(self.urlLine.text())
if url.isValid():
self.webEngineView.load(url)# 加载网页
def urChanged(self,url):
self.urlLine.setText(url.toString())# 显示新的地址
def homeBtn_clicked(self):
self.webEngineView.load("https;//www.sohu.com")
if __name__ =='__main__':
app = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec())