======博客点滴积累,部分话语和知识点来源于网络,感谢网络资源的提供者======
QWebengine目前只支持msvc,不支持mingw。安装qt 是需要注意勾选; Webenginewidgets 是创建widgets部件的web 程序,Webchannel 是通信类,可以实现qt 与js 的通信。
第一步: 故实现需要在pro 文件添加这两个类
QT += core gui
QT += webenginewidgets webchannel
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
第二步:编写继承于QObject类
#define JSCONTEXT_H
#include <QObject>
#include <QtDebug>
class JsContext : public QObject
{
Q_OBJECT
public:
explicit JsContext();
signals:
// 向js页面发送消息
void sendtojsMsg(const QString& msg);
public slots:
// 接收js页面发送的消息
void recvjsMsg(const QString& msg);
public slots:
// 接收main widget 发送的数据
void recvwidgetMsg(const QString& msg);
};
#endif // JSCONTEXT_H
#include "jscontext.h"
JsContext::JsContext()
{
}
void JsContext::recvjsMsg(const QString &msg)
{
//qDebug()<<"recvjs:"<<msg;
}
void JsContext::recvwidgetMsg(const QString& msg)
{
emit sendtojsMsg(msg); /* 发送到js页面*/
}
第三步
1)在qt designer 拖一个QWebEngineView,在构造函数中实现Webchannel 与qt 对象的绑定
m_webChannel = new QWebChannel(ui->webview->page());
m_jsContext = new JsContext();
m_webChannel->registerObject(QStringLiteral("m_jsContext"), m_jsContext);
ui->webview->page()->setWebChannel(m_webChannel);
ui->webview->load(QUrl("file:///" + qApp->applicationDirPath() + "/index_line.html"));
connect(this, SIGNAL(notityUpdate(const QString&)), m_jsContext, SLOT(recvwidgetMsg(const QString&)));
2)向js 发送数据
QString value;
QDateTime local(QDateTime::currentDateTime());
QString localTime = local.toString("yyyy/MM/dd hh:mm:ss");
qsrand(QDateTime::currentDateTime().toMSecsSinceEpoch());
int rand1 = qrand() % 1000;
int rand2 = qrand() % 300;
QJsonObject json;
json.insert("time", localTime);
json.insert("val1", rand1);
json.insert("val2", rand2);
// 构建 JSON 文档
QJsonDocument document;
document.setObject(json);
QByteArray byteArray = document.toJson(QJsonDocument::Compact);
QString strJson(byteArray);
qDebug() << strJson;
qDebug("cnt=%d",cnt);
cnt++;
emit notityUpdate(strJson);
第四步 拷贝一个 qwebchannel.js qt 安装目录有搜索一下就可以了,编译时同时将这个文件拷贝到debug或者release。
第五步 下载一个echarts,实现一个html 调用echarts,具体接收qt 来的数据如下:
var updateChart = function(objdata) {
var obj = JSON.parse(objdata);
data1.push(obj.val1);
data2.push(obj.val2);
timea.push(obj.time)
myChart.setOption(option,true);
}
window.onload = function(){
new QWebChannel(qt.webChannelTransport,
function(channel) {
var m_jsContext = channel.objects.m_jsContext;
m_jsContext.sendtojsMsg.connect(updateChart);
}
);
}
注:qt5.12.0 调用echarts 图表会有一个很窄的白边,5.12.3 不存在这个问题,建议使用5.12.3 及其以上版本
完整实例下载地址:https://download.csdn.net/download/wang112031/11702507