QT和JS的互相调用例子
转自:
http://blog.163.com/qimo601@126/blog/static/15822093201682185819623/
Qt 4.8.4
MainWindow.jsInvokeQt();
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:"<<str;
if(str.isEmpty())
{
qDebug()<<"str is empty!";
return;
}
else
{
testStr = str;
}
}
/* JavaScript invoke Qt里面的public slot 槽函数 */
QString MainWindow::getInfor()
{
qDebug()<<"MainWindow::GetInfor(),\t "<<testStr;
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>
QT和JS的互相调用例子的更多相关文章
- node源码详解(四) —— js代码如何调用C++的函数
本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource4 本博客同步在https://cnodejs.o ...
- Qt与JS(三)
Qt不错的学习网址: http://www.cnblogs.com/findumars/p/5529526.html ----------------------------------------- ...
- Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结
Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结 1.1. 边缘检测的基本方法Canny最常用了1 1.2. 编写matlab边缘检测代码, ...
- Unity3D中C#和js方法相互调用
通过查找资料,Unity3D中C#和js要相互调用彼此的方法,js文件必须放在"Standard Assets". "Pro Standard Assets" ...
- js函数的调用问题
1.js函数的调用方式有三种.请问以下“二”处的几行代码有什么猫腻? //一 事件调用 btn.onclick=fn; //二 直接调用(window调用) fn(); //自上而下解析到这一行的时候 ...
- iOS js oc相互调用(JavaScriptCore)(二)
下来我们使用js调用iOS js调用iOS分两种情况 一,js里面直接调用方法 二,js里面通过对象调用方法 首先我们看第一种,直接调用方法. 其中用到了iOS的block 上代码 -(void)we ...
- js switch表达式的例子
switch 这种表达式在很多语言中都有,比如java, C等待, 使用switch比使用if else 来得方便,来得清晰. 前言 switch 这种表达式在很多语言中都有,比如java, C等待 ...
- gwt中java与js的相互调用
1. java通过jsni调用内部js Button button = new Button("java调用内部jsni的js方法"); button.addClickHandle ...
- iOS js oc相互调用(JavaScriptCore 下)
下来我们使用js调用iOS js调用iOS分两种情况 一,js里面直接调用方法 二,js里面通过对象调用方法 首先我们看第一种,直接调用方法. 其中用到了iOS的block 上代码 -(void)we ...
随机推荐
- _spellmod_leech_spell
comment 备注 spell 技能ID,玩家释放该技能时附带吸血效果 meetAura 产生吸血效果需要满足的光环ID,比如做一个空的光环,为寒冰箭吸血光环,则有些光环时候,寒冰箭会附带吸血效 ...
- STL——vector
学到STL的vector,发现手中的材料不是很详细,这里做个汇总. 1 操作 (1)头文件#include<vector>. (2)创建vector对象,vector<int> ...
- JNI C创建Java字符串数组
创建Java字符串数组 注:jni中没有与String[]对应的数据类型,所以需要创建对象数组,循环添加jstring对象 #include <Sample3.h> #include &l ...
- 第 3 章 镜像 - 010 - base 镜像
base 镜像有两层含义: 不依赖其他镜像,从 scratch 构建. 其他镜像可以之为基础进行扩展. 能称作 base 镜像的通常都是各种 Linux 发行版的 Docker 镜像,比如 Ubunt ...
- clustering
搞了将近一年的单细胞,聚类也是自认为得心应手了,自信满满. 但是多半是跑软件,对聚类的深层次的思想不甚了了. Google了一下clustering,看了一篇文章,突然了解到了clustering的算 ...
- English trip V1 - 22. My Life Teacher:Emily Key: describe talk about past 过去式
In this lesson you will learn to talk about the past. 课上内容(Lesson) I was born in 1986. I started sch ...
- 10 Node Frameworks to Use in 2019
原文 https://scotch.io/bar-talk/10-node-frameworks-to-use-in-2019 node Framworks列表: http://nodeframewo ...
- ModelViewSet 视图集 实现接口
一.创建项目 1.创建 项目 : django-admin startprojet drf 2. 创建 两个app ------ app1 ,book python manage.py start ...
- 十分钟搞定pandas内容
目录 十分钟搞定pandas 一.创建对象 二.查看数据 三.选择器 十二.导入和保存数据 参考:http://pandas.pydata.org/pandas-docs/stable/whatsne ...
- 自动化(脚本)安装httpd服务
思路: 1.检查传递的参数,httpd源码文件 2.检查执行脚本的用户是否为root 3.检查rpm是否安装过httpd,若安装过,则卸载 4.安装编译所需的工具 5.从网上下载httpd源码 6.配 ...