这里实现的内容,在Qt里嵌入一个Html网页。这里使用了QWebEngineView来实现。
然后要让网页和C++怎么交互呢?
这里需要几个关键的类
QWebChannel
然后就是一个继承自QObject的类
#pragma once
#include <QObject>
#include <QDebug>
#include <QMessageBox>
class MidHelper : public QObject
{
Q_OBJECT
public:
MidHelper(QObject *parent = nullptr);
~MidHelper();
public slots:
// 接收到页面发送来的消息
void web_to_cpp(const QString& msg);
};
然后我把网页放到了qt程序中
m_view = new QWebEngineView(this);
...
QVBoxLayout* v_layout_main = new QVBoxLayout();
setLayout(v_layout_main);
建立沟通web和c++的桥梁
m_midHelper = new MidHelper(this);
m_webChannel = new QWebChannel(this);
m_webChannel->registerObject("xxx", m_midHelper); // xxx是我取的名字
m_view->page()->setWebChannel(m_webChannel);
这里需要注意注册对象,第一个参数是一会web里要用的名字,第二个是要调用的对象。
然后QWebEngineView对象的m_view调page找到那个web页面,架桥setWebChannel。
然后是网页里的代码
<button id="btn_ff">ff</button>
<script type="text/javascript">
$('#btn_ff').click(function(){
new QWebChannel(qt.webChannelTransport,
function(channel){
var webobj = channel.objects.xxx;
window.foo = webobj;
webobj.web_to_cpp("dadasd");
});
})
// 信号槽绑定
function js_function(content)
{
alert("js_function:"+ content);
}
</script>
这里主要一下只要 注意
var webobj = channel.objects.xxx;
里面的xxx就是上面设置的名字。其他地方复制粘贴,webobj对象调用方法,C++有什么方法直接调用就完事了,当然最好是字符串,其他类型的没试过。
然后C++怎么调web里面的方法呢?
m_view->page()->runJavaScript(QString("js_function('%1');").arg(m_lineEdit->text()));
参考一下,方法名称用字符串拼接出来的,用arg格式化占位符补充内容。
总结一下:
1.QWebChannel和QWebEngineView
2.QWebChannel的对象要塞一个QObject对象
m_webChannel->registerObject("xxx", m_midHelper);
3.JS里
new QWebChannel(qt.webChannelTransport,
function(channel){
var webobj = channel.objects.xxx;
window.foo = webobj;
webobj.web_to_cpp("dadasd");
});
xxx名字,方法是被塞入QObject里面的方法
4.C++里
m_view->page()->runJavaScript(QString("js_function('%1');").arg(m_lineEdit->text()));
用字符串拼web里面的方法
相关资料:
https://doc.qt.io/qt-5/qtwebchannel-javascript.html#setting-up-the-javascript-api