文章目录
-
- 1 基本使用
-
- 1.1 WebEngine Widgets
- 1.2 QWebEngineView
- 1.3 QWebEnginePage
- 1.4 QWebEngineSettings
- 1.5 QWebEngineScript
- 1.6 QWebEngineScriptCollection
- 1.7 QWebEngineFullScreenRequest
- 1.8 QWebEngineCertificateError
- 1.9 QWebEngineClientCertificateSelection
- 1.10 QWebEngineDownloadItem
- 1.11 QWebEngineContextMenuData
- 1.12 QChannel
- 1.13 Chromium
- 1.14 URI解析
- 1.15 QtWebEngineProcessd.exe
- 1.16 QWebEngineHistory
- 2 问题解决
- 3 透明失效
- 4 未完待续
- 5 参考链接
1 基本使用
本节先完整梳理下Qt
内嵌Web
相关模块、类和基本用法,
模块架构
1.1 WebEngine Widgets
WebEngine Widgets
提供了用于将Web
内容嵌入QWidget
等窗口控件,
1)组件组成
类名 | 功能 |
---|---|
QWebEngineView |
用于展示web ,提供加载url 、导航历史、页面缩放等接口 |
QWebEnginePage |
用于表示web 页面,提供执行js 方法、处理表单、截图等接口 |
QWebEngineProfile |
用于表示浏览器配置文件,提供设置缓存、cookie 和安全策略等接口 |
QWebEngineSettings |
用于表示浏览器设置,提供设置web 字体、颜色、js 和插件等接口 |
2)组件关系
Qt WebEngine
基于QNetworkAccessManager
和QSslSocket
处理网络通信、证书验证等。
1.2 QWebEngineView
QWebEngineView
是Qt
内嵌web
的关键控件,支持HTML5
、js
和CSS3
。
1)示例代码
QWebEngineView view;
view.load(QUrl("https://www.baidum.com"));
view.show();
1.3 QWebEnginePage
QWebEnginePage
用于表示加载到QWebEngineView
中的web
页面。
1)示例代码
QWebEngineView view;
QWebEnginePage page;
view.setPage(&page);
page.load(QUrl("https://www.baidu.com"));
view.show();
2)常用方法
名称 | 作用 |
---|---|
loadStarted /loadProgress /loadFinished |
用于监听页面加载状态 |
urlChanged |
用于监听页面url 变更 |
runJavaScript |
用于执行页面中的js 代码 |
3)懒加载
从page
源码学习下Qt
懒加载C++
代码写法,
QWebEnginePage* QWebEngineView::page() const
{
Q_D(const QWebEngineView);
if (!d->page) {
QWebEngineView *that = const_cast<QWebEngineView*>(this);
that->setPage(new QWebEnginePage(that));
d->m_ownsPage = true;
}
return d->page;
}
1.4 QWebEngineSettings
QWebEngineSettings
用于配置web
设置选项,包括字体、缩放、js
支持和插件支持等。
1)常用方法
名称 | 作用 |
---|---|
setFontFamily |
用于设置字体、样式 |
setFontSize |
用于设置字体大小 |
setAttribute |
用于开启/关闭特性,包括js 支持、插件支持(flash 和视频解码器等)、本地存储、离线web 应用、错误页面等 |
setUnknownUrlSchemePolicy |
用于配置跨域访问策略 |
2)示例代码
QWebEngineView view;
QWebEngineSettings *settings = view.page()->settings();
settings->setFontFamily(QWebEngineSettings::StandardFont, "黑体");
settings->setFontSize(QWebEngineSettings::DefaultFontSize, 20);
settings->setAttribute(QWebEngineSettings::JavascriptEnabled, true);
settings->setAttribute(QWebEngineSettings::PluginsEnabled, true);
view.load(QUrl("https://www.baidu.com"));
view.show();
1.5 QWebEngineScript
QWebEngineScript
支持通过注入js
脚本到网页来新增/修改现有功能,可以配置脚本执行时机(web
加载开始或结束)。
1)示例代码
QWebEngineView view;
QWebEnginePage page;
QWebEngineScript script;
script.setName("testScript");
script.setSourceCode("alert('test script');");
script.setInjectionPoint(QWebEngineScript::DocumentReady);
script.setRunsOnSubFrames(false);
script.setWorldId(QWebEngineScript::ApplicationWorld);
page.scripts().insert(script);
view.setPage(&page);
page.load(QUrl("https://www.baidu.com"));
view.show();
1.6 QWebEngineScriptCollection
用于管理 QWebEnginePage
实例中的所有脚本。
1.7 QWebEngineFullScreenRequest
当web
触发全屏模式请求时,如HTML5``video
元素的全屏按钮,QWebEnginePage
发出fullScreenRequested
信号,QWebEngineFullScreenRequest
对象作为该信号的惨数传递,用于处理web
发出的全屏显示请求。
1)常用方法
名称 | 作用 |
---|---|
reject |
用于拒绝全屏请求 |
accept |
用于接受全屏请求 |
toggleOn |
用于·表示请求是进入全屏模式还是退出全屏模式 |
origin |
用于获取发出全屏请求的web 元素 |
2)示例代码
#include <QWebEngineView>
#include <QWebEnginePage>
#include <QWebEngineFullScreenRequest>
class TestWebEngineView : public QWebEngineView
{
Q_OBJECT
public:
MyWebEngineView() {
connect(page(), SIGNAL(fullScreenRequested(QWebEngineFullScreenRequest)),
this, SLOT(slotFullScreenRequested(QWebEngineFullScreenRequest));
}
private slots:
void slotFullScreenRequested(QWebEngineFullScreenRequest request) {
if (request.toggleOn()) {
showFullScreen();
} else {
showNormal();
}
request.accept();
}
};
1.8 QWebEngineCertificateError
QWebEngineCertificateError
用于处理SSL
证书错误,当QWebEnginePage
加载使用 SSL
加密的网页时,遇到证书错误,函数certificateError
会被执行,QWebEngineCertificateError
对象作为参数传递。
1)常用方法
名称 | 作用 |
---|---|
error |
用于获取错误类型 |
errorDescription |
用于获取错误描述 |
url |
用于获取错误url |
ignoreCertificateError |
用于忽略错误并继续加载web |
2)示例代码
#include <QWebEngineView>
#include <QWebEnginePage>
#include <QWebEngineCertificateError>
class TestWebEnginePage : public QWebEnginePage
{
Q_OBJECT
protected:
bool certificateError(const QWebEngineCertificateError &error) override
{
if (error.error() == QWebEngineCertificateError::CertificateAuthorityInvalid)
{
qDebug() << "Ignoring certificate error:" << error.errorDescription();
return true;
}
return false;
}
};
1.9 QWebEngineClientCertificateSelection
QWebEngineClientCertificateSelection
用于处理客户端证书选择,当服务器要求客户端提供证书进行身份验证时,QWebEnginePage 会发出一个 selectClientCertificate
信号,携带参数 QWebEngineClientCertificateSelection
对象,可使用该类选择一个合适的客户端证书,返回给服务器。
1)常用方法
名称 | 作用 |
---|---|
certificates |
用于获取客户端可用证书列表 |
select |
用于从可用证书列表中选择1个,返回给服务器 |
host |
用于获取服务器发请求的url |
2)示例代码
#include <QWebEngineView>
#include <QWebEnginePage>
#include <QWebEngineClientCertificateSelection>
class TestWebEnginePage : public QWebEnginePage
{
Q_OBJECT
public:
TestWebEnginePage()
{
connect(this, &QWebEnginePage::selectClientCertificate,
this, &MyWebEnginePage::handleClientCertificateSelection);
}
private slots:
void handleClientCertificateSelection(QWebEngineClientCertificateSelection selection)
{
if (!selection.certificates().isEmpty())
{
selection.select(selection.certificates().first());
} else
{
selection.select(QSslCertificate());
}
}
};
1.10 QWebEngineDownloadItem
QWebEngineDownloadItem
用于表示下载项。当用户触发下载请求(点击下载链接),QWebEngineProfile
发出downloadRequested
信号,携带参数QWebEngineDownloadItem
对象,可用于获取下载项信息、控制下载过程。
1)常用方法
名称 | 作用 |
---|---|
state |
用于获取下载项的当前状态,如下载中、已完成、已取消等 |
totalBytes |
用于获取下载项的总字节信息 |
receivedBytes |
用于获取提供了下载项的已接收字节信息 |
url |
用于获取下载项的源url |
setPath |
用于设置下载项的保存路径 |
2)示例代码
#include <QApplication>
#include <QWebEngineView>
#include <QWebEngineProfile>
#include <QWebEngineDownloadItem>
#include <QStandardPaths>
class MyWebEngineProfile : public QWebEngineProfile
{
Q_OBJECT
public:
MyWebEngineProfile()
{
connect(this, &QWebEngineProfile::downloadRequested,
this, &MyWebEngineProfile::handleDownloadRequested);
}
private slots:
void handleDownloadRequested(QWebEngineDownloadItem *download)
{
QString downloadPath = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation);
download->setPath(downloadPath + "/" + download->downloadFileName());
download->accept();
connect(download, &QWebEngineDownloadItem::downloadProgress,
this, &MyWebEngineProfile::handleDownloadProgress);
connect(download, &QWebEngineDownloadItem::finished,
this, &MyWebEngineProfile::handleDownloadFinished);
}
void handleDownloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
qDebug() << "Download progress:" << bytesReceived << "/" << bytesTotal;
}
void handleDownloadFinished()
{
qDebug() << "Download finished.";
}
};
1.11 QWebEngineContextMenuData
QWebEngineContextMenuData
用于提供上下文菜单数据,当用户在QWebEngineView
中右击,QWebEnginePage
发出contextMenuRequested
信号,携带参数QWebEngineContextMenuData
对象,可用该对象获取上下文菜单信息,根据需要创建和显示上下文菜单。
1)常用方法
名称 | 作用 |
---|---|
position |
用于获取触发位置对应鼠标坐标 |
selectedText |
用于获取触发位置附近的选中文本 |
linkText |
用于获取触发位置所包含链接的文本 |
linkUrl |
用于获取触发位置所包含链接的url |
mediaUrl |
用于获取触发位置所包含图像的url |
mediaType |
用于获取触发位置所包含媒体元素的类型 |
2)示例代码
#include <QWebEngineView>
#include <QWebEnginePage>
#include <QWebEngineContextMenuData>
#include <QMenu>
class TestWebEnginePage : public QWebEnginePage
{
Q_OBJECT
public:
TestWebEnginePage()
{
connect(this, &QWebEnginePage::contextMenuRequested,
this, &TestWebEnginePage::handleContextMenuRequested);
}
private slots: