博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
QT和JS的互相调用例子
阅读量:5057 次
发布时间:2019-06-12

本文共 3349 字,大约阅读时间需要 11 分钟。

转自:

http://blog.163.com/qimo601@126/blog/static/15822093201682185819623/

Qt 4.8.4

感谢原作者,我只转载。
看看作者如何实现:
1、Qt源码调用html中js的函数disp_messagebox();
2、js源码中如何调用qt中的函数  
MainWindow.jsInvokeQt();
MainWindow.setInfor("Qt change string"); 
alert(MainWindow.getInfor());
 
页面载入完成的信号:
connect(ui.webView->page()->mainFrame(), SIGNAL(loadFinished(bool)),
            this, SLOT(callFunction()));
 
由于篇幅限制,我就不发头文件了,详细源码可以下载附件
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
 
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
 
/* 载入html网页 */
m_pWebView = new QWebView();
 
m_pWebView->load(QUrl("file:///D:/jsTest.html"));
 
m_pWebView->show();
 
/* 开启JavaScript支持 */
QWebSettings *pWebSettings = m_pWebView->page()->settings();
 
pWebSettings->setAttribute(QWebSettings::JavascriptEnabled,true);
 
/* 窗体布局, 添加按钮 */
QPushButton *pEventBtn = new QPushButton(tr("QT Invoke JavaScript web page Object"));
QPushButton *pcloseBtn = new QPushButton(tr("close"));
 
/* 布局:网页与按钮为上下布局,两按钮为水平居中布局 */
QHBoxLayout *pBtnLayout = new QHBoxLayout;
 
pBtnLayout->addWidget(pEventBtn);
 
pBtnLayout->addWidget(pcloseBtn);
 
pBtnLayout->setAlignment(Qt::AlignCenter);
 
QVBoxLayout *pMainLayout = new QVBoxLayout;
 
pMainLayout->addWidget(m_pWebView);
 
pMainLayout->addLayout(pBtnLayout);
 
QWidget *widget = new QWidget;
 
widget->setLayout(pMainLayout);
 
setCentralWidget(widget);
 
/* 建立信号与槽, 每次载入html时发送段信号 */
connect(m_pWebView->page()->mainFrame(),SIGNAL(javaScriptWindowObjectCleared()),
this,SLOT(addObjectToJs()));
 
connect(pEventBtn,SIGNAL(clicked()),this,SLOT(testJs()));
 
connect(pcloseBtn,SIGNAL(clicked()),this,SLOT(close()));
 
testStr.clear();
}
 
MainWindow::~MainWindow()
{
if(m_pWebView != NULL)
{
delete m_pWebView;
m_pWebView = NULL;
}
 
/* 必须的,否则,在debug编译模式下就会出现leak错误 */
QWebSettings::globalSettings()->clearMemoryCaches();
 
delete ui;
}
 
/* 这个public slot槽函数是为了响应JavaScript的的invoke的 */
void MainWindow::jsInvokeQt()
{
qDebug()<<"MainWindow::jsInvokeQt(),\t JavaScript invoke Qt program!";
}
 
/* 将MainWindows这个类的名称&&对象指针发送给JavaScript */
void MainWindow::addObjectToJs()
{
m_pWebView->page()->mainFrame()->addToJavaScriptWindowObject("MainWindow",this);
}
 
/* Qt来 invoke JavaScript里面的disp_messagebox()函数 */
void MainWindow::testJs()
{
qDebug()<<"MainWindow::testJs(),\t Qt invoke JavaScript's function";
m_pWebView->page()->mainFrame()->evaluateJavaScript("disp_messagebox()");
}
 
/* JavaScript invoke Qt里面的public slot 槽函数 */
void MainWindow::setInfor(const QString str)
{
qDebug()<<"MainWindow::setInfor(const QString str),\t Response of js Invoke!"<<"var is:"<
if(str.isEmpty())
{
qDebug()<<"str is empty!";
return;
}
else
{
testStr = str;
}
}
 
/* JavaScript invoke Qt里面的public slot 槽函数 */
QString MainWindow::getInfor()
{
qDebug()<<"MainWindow::GetInfor(),\t "<
return testStr;
} -----------------------------------------------------------------------------
<html>
 
<head>
 
<script type=
"text/javascript"
>
 
function disp_messagebox()
{
    
alert(
"This is javaScript MessageBox come from alert!"
)
 
function disp_qtmessage()
{
  
alert(
"disp_messagebox function, who is in JavaScript!"
)
   
  
MainWindow.jsInvokeQt();
 
  
MainWindow.setInfor(
"Qt change string"
); 
  
  
alert(MainWindow.getInfor());
 
</script>
 
</head>
 
<body> 
 
<input type=
"button" 
onclick=
"disp_qtmessage()" 
value=
"JavaScript Invoke Qt Object" 
/> 
 
</body>
 
</html>

 

转载于:https://www.cnblogs.com/zhangxuan/p/7576773.html

你可能感兴趣的文章
java导出Excel表格简单的方法
查看>>
SQLite数据库简介
查看>>
利用堆实现堆排序&amp;优先队列
查看>>
Mono源码学习笔记:Console类(四)
查看>>
Android学习路线(十二)Activity生命周期——启动一个Activity
查看>>
《Genesis-3D开源游戏引擎完整实例教程-跑酷游戏篇03:暂停游戏》
查看>>
CPU,寄存器,一缓二缓.... RAM ROM 外部存储器等简介
查看>>
windows下编译FreeSwitch
查看>>
git .gitignore 文件不起作用
查看>>
Alan Turing的纪录片观后感
查看>>
c#自定义控件中的事件处理
查看>>
App.config自定义节点读取
查看>>
unity3d根据手机串号和二维码做正版验证
查看>>
二十六、Android WebView缓存
查看>>
django Models 常用的字段和参数
查看>>
linux -- 嵌入式linux下wifi无线网卡驱动
查看>>
SVN使用教程总结
查看>>
SQL中varchar和nvarchar有什么区别?
查看>>
OpenCV矩阵运算总结
查看>>
Java Build Practice 4:Extend and Invoke Ant API
查看>>