Qt 嵌入网页

Qt 嵌入网页

  • MSVC版本:Qt WebEngine
    • 显示在线网页:
    • 显示本地网页:
    • 本地网页JS与Qt相互掉调用:
  • MinGW 版本:QAxWidget
  • MinGW 版本:miniblink
      • 显示本地网页并实现与JS互相调用

Qt 版本5.6以上.

MSVC版本:Qt WebEngine

在安装Qt时需要选择支持Qt WebEngine:
Qt 嵌入网页_第1张图片
如果只是访问本地html可以不需要network

QT +=  webenginewidgets webchannel network

Qt 嵌入网页_第2张图片
添加布局窗口Widget,提升部件QWebEngineView
Qt 嵌入网页_第3张图片

显示在线网页:

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);

本地网页JS与Qt相互掉调用:

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>

Qt 嵌入网页_第4张图片
Qt工程代码如下:
Qt 嵌入网页_第5张图片Qt 嵌入网页_第6张图片
Qt调用JS方法按如下使用:

 ui->widget->page()->runJavaScript(QString("showAlert(%1)").arg(参数).toLatin1().data());

项目点击这里可以下载下来参考。

MinGW 版本:QAxWidget

查看机器注册表文件,按路径找到下图的位置,图中右边的数据代码中需要用到:
Qt 嵌入网页_第7张图片
布局如下
Qt 嵌入网页_第8张图片
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交互。

MinGW 版本:miniblink

GitHub地址,用到的头文件和dll也可以点这里下载。
布局:
Qt 嵌入网页_第9张图片
工程中添加node.dll和wkedefine.h:
Qt 嵌入网页_第10张图片
编译一下,把node.dll添加到exe的同级目录下:
Qt 嵌入网页_第11张图片
初始化wke:

#include 
wkeInitialize();

Qt 嵌入网页_第12张图片
在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);
}

显示本地网页并实现与JS互相调用

相比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>

下图中的几条箭头表示Qt和JS的方法名要相互对应:
Qt 嵌入网页_第13张图片

#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;
}

这样就可以实现相互调用:
Qt 嵌入网页_第14张图片
点击这里下载参考demo,需要把node.dll复制到exe同级目录,编译选择MinGW 32bit
注意:开源免费版本方式不支持webgl
比如ECharts的示例图:Qt 嵌入网页_第15张图片
在Qt中显示就会出现错误提示:
Qt 嵌入网页_第16张图片
使用Qt WebEngine就可以正常显示:
Qt 嵌入网页_第17张图片

你可能感兴趣的:(Qt)