Qt 版本5.6以上.
在安装Qt时需要选择支持Qt WebEngine:
如果只是访问本地html可以不需要network
QT += webenginewidgets webchannel network
添加布局窗口Widget,提升部件QWebEngineView
ui->widget->setUrl(QUrl(QStringLiteral("https://www.baidu.com")));
ui->widget->setUrl(QUrl("E:/workspace/Qt_workspace/Qt_JS_Demo/test.html"));
设置缩放比例:
ui->widget->setZoomFactor(0.5);
html全部代码如下(其中qwebchannel.js在Qt的安装目录下可以找到):
<html>
<head>
<script src="qwebchannel.js">script>
<script type="text/javascript">
function showAlert(data) {
alert(data);
}
var data=0;
function jsInvokeC() {
bridgeJS.getdate(data++);
}
// QT交互
new QWebChannel(qt.webChannelTransport, function(channel) {
window.bridgeJS = channel.objects.bridge;
});
script>
head>
<body>
<div>
<input type="button" value="调用c++" onclick="jsInvokeC()">
div>
body>
html>
ui->widget->page()->runJavaScript(QString("showAlert(%1)").arg(参数).toLatin1().data());
项目点击这里可以下载下来参考。
查看机器注册表文件,按路径找到下图的位置,图中右边的数据代码中需要用到:
布局如下
QT += axcontainer
显示本地网页:
QAxWidget *myWidget = new QAxWidget(this);
ui->mainLayout->addWidget(myWidget);
myWidget->setControl(QString::fromUtf8("{8856F961-340A-11D0-A96B-00C04FD705A2}"));//注册组件UUID
myWidget->setObjectName(QString::fromUtf8("my_musicLibraryWebWid"));//设置控件的名称
myWidget->setFocusPolicy(Qt::StrongFocus); //设置控件接收键盘焦点的方式:鼠标单击、Tab键
myWidget->setProperty("DisplayAlerts",false); //不显示任何警告信息。
myWidget->setProperty("DisplayScrollBars",true); // 显示滚动条
QString sFilePath = "E:/workspace/Qt_workspace/Qt_JS_Demo/test.html";
myWidget->dynamicCall("Navigate(const QString&)",sFilePath.trimmed());
http网页(只有最后两行有区别):
QAxWidget *myWidget = new QAxWidget(this);
ui->mainLayout->addWidget(myWidget);
myWidget->setControl(QString::fromUtf8("{8856F961-340A-11D0-A96B-00C04FD705A2}"));//注册组件UUID
myWidget->setObjectName(QString::fromUtf8("my_musicLibraryWebWid"));//设置控件的名称
myWidget->setFocusPolicy(Qt::StrongFocus); //设置控件接收键盘焦点的方式:鼠标单击、Tab键
myWidget->setProperty("DisplayAlerts",false); //不显示任何警告信息。
myWidget->setProperty("DisplayScrollBars",true); // 显示滚动条
QString webstr = QString("www.baidu.com");//设置要打开的网页
myWidget->dynamicCall("Navigate(const QString&)",webstr);
未尝试与JS交互。
GitHub地址,用到的头文件和dll也可以点这里下载。
布局:
工程中添加node.dll和wkedefine.h:
编译一下,把node.dll添加到exe的同级目录下:
初始化wke:
#include
wkeInitialize();
在mainwindow.cpp添加下面几行就可以显示在线网页了:
#include
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 绑定显示控件
wkeWebView webView= wkeCreateWebWindow(WKE_WINDOW_TYPE_CONTROL, (HWND)ui->widget->winId(), 0, 0, ui->widget->width(),ui->widget->height());
// 显示wkeWebView
wkeShowWindow(webView, true);
// 加载网页
QString url = "https://www.baidu.com";
wkeLoadURL(webView,url.toLatin1().data());
// 显示缩放
wkeSetZoomFactor(webView, 0.5f);
}
相比Qt WebEngine,wke要实现互相调用html会更简洁:
<html>
<head>
<script type="text/javascript">
function showAlert(data) {
alert(data);
}
var data=0;
function jsInvokeC() {
getdate(data++);
}
script>
head>
<body>
<div>
<input type="button" value="调用c++" onclick="jsInvokeC()">
div>
body>
html>
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
wkeWebView webView;
//js调用c++接口
jsValue JS_CALL getdate(jsExecState es)
{
qDebug(jsToString(es, jsArg(es, 0)));
return jsFalse();
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 关于wke函数详见 wkedefine.h
// 创建wkeWebView实例并将其绑定到qt界面中的widget控件
webView= wkeCreateWebWindow(WKE_WINDOW_TYPE_CONTROL, (HWND)ui->widget->winId(), 0, 0, ui->widget->width(),ui->widget->height());
// 显示wkeWebView
wkeShowWindow(webView, true);
// 加载本地网页
QFile file("E:/workspace/Qt_workspace/Qt_JS_Demo/test.html");
file.open(QIODevice::ReadOnly);
wkeLoadHTML(webView,file.read(file.bytesAvailable()));
file.close();
//绑定js要调用的c++方法,第一个参数是js中执行的方法,第二个参数是c++中定义的全局方法,第三个参数是方法传递的参数个数
jsBindFunction("getdate",getdate,1);
}
void MainWindow::on_pushButton_clicked()
{
static int count = 0;
wkeRunJS(webView,QString("showAlert(%1)").arg(++count).toLatin1().data());
}
MainWindow::~MainWindow()
{
delete ui;
}
这样就可以实现相互调用:
点击这里下载参考demo,需要把node.dll复制到exe同级目录,编译选择MinGW 32bit。
注意:开源免费版本方式不支持webgl
比如ECharts的示例图:
在Qt中显示就会出现错误提示:
使用Qt WebEngine就可以正常显示: