QT与JavaScript互调 - 虹的日志 - 网易博客

QT与JavaScript互调  

2012-05-29 21:43:14|  分类: 技术 |  标签:qt  javascript  webkit  qwebkit   |举报 |字号大中小 订阅

 
 

一、QT中文支持

 

//编码设置

  QTextCodec *codec = QTextCodec::codecForName("GBK");  

  QTextCodec::setCodecForCStrings(codec);    

  QTextCodec::setCodecForLocale(codec); 

  QTextCodec::setCodecForTr(codec);

 

//使用中文字符串

setWindowTitle(tr("JavaScript测试"));

 

二、QT支持Js流程

QT与JavaScript互调是通过QWebFrame的两个函数来实现的:addToJavaScriptWindowObject()将QObject对象传给JS,这样JS就能调用QObject的public slots函数。QT通过evaluateJavaScript()直接调用JS中的函数。流程如下(《QT高级编程》中插图):

 

 

 

 

三、示例

使用QWebKit创建一个包含浏览器和工具按钮窗口,在该浏览器中载入包括Js的html,工具按钮调用html中的js

1、工程中引入 webkit

   工程文件中增加加:QT += webkit network

2、载入html网页

m_pWebView = new QWebView;

    m_pWebView->load(QUrl(tr("G:\\html特效示例\\jsTest.html")));

3、开户js支持

    QWebSettings *pWebSettings = m_pWebView->page()->settings();       

    pWebSettings->setAttribute(QWebSettings::JavascriptEnabled,true);

4、窗体布局

//添加按钮    

    QPushButton *pEventBtn = new QPushButton(tr("QT Invok Js"));   

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

 

5、建立信号与槽

//每次载入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()));

 

6、JS调用QT中的public slots

6.1、头文件中申明public slots:

public slots:   

    void jsInvokQt();   

 

 

6.2、将QObject与js绑定

void MainWindow::addObjectToJs()

{

     m_pWebView->page()->mainFrame()->addToJavaScriptWindowObject("MainWindow",this);

}

6.3、Js中调用QT的 jsInvokQt()函数

function disp_qtmessage()

{

        MainWindow.jsInvokQt();

}

7、QT调用JS函数disp_messagebox()

void MainWindow::testJs()

{    

    m_pWebView->page()->mainFrame()->evaluateJavaScript("disp_messagebox()");

}

 

四、附含JS的html源码:

<html>

<head>

<script type="text/javascript">

function disp_messagebox()

{

alert("This is javaScript MessageBox!")

}

 

function disp_qtmessage()

{

  MainWindow.jsInvokQt();

   MainWindow.setInfor("Qt change string"); 

   alert(MainWindow.getInfor());

}

 

</script>

</head>

<body>

 

<input type="button" onclick="disp_qtmessage()" value="InvokQt" />

 

</body>

</html>

QT与JavaScript互调 - 虹的日志 - 网易博客的更多相关文章

  1. jquery选择器 之 获取父级元素、同级元素、子元素 - yes的日志 - 网易博客

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  2. 【绿茶书情】:《SOHO小报》和《凤… - 绿茶的日志 - 网易博客

    [绿茶书情]:<SOHO小报>和<凤- - 绿茶的日志 - 网易博客 [绿茶书情]:<SOHO小报>和<凤-  

  3. python海明距离 - 5IVI4I_I_60Y的日志 - 网易博客

    python海明距离 - 5IVI4I_I_60Y的日志 - 网易博客 python海明距离   2009-10-01 09:50:41|  分类: Python |  标签: |举报 |字号大中小  ...

  4. stringstream clear()的疑问 - yuanshuilee的日志 - 网易博客

    stringstream clear()的疑问 - yuanshuilee的日志 - 网易博客 stringstream clear()的疑问   2013-09-05 08:43:13|  分类: ...

  5. Org-mode五分钟教程ZZZ - Kaka Abel的日志 - 网易博客

    Org-mode五分钟教程ZZZ - Kaka Abel的日志 - 网易博客 Org-mode五分钟教程ZZZ  

  6. 【错误】expected constructor, destructor, or type conversion before '.' token - 第八个游侠的日志 - 网易博客

    [错误]expected constructor, destructor, or type conversion before '.' token - 第八个游侠的日志 - 网易博客 [错误]expe ...

  7. random_shuffle (stl算法)打乱顺序 - 飞不会的日志 - 网易博客

    random_shuffle (stl算法)打乱顺序 - 飞不会的日志 - 网易博客 random_shuffle (stl算法)打乱顺序 2012-03-31 10:39:11|  分类: 算法 | ...

  8. 你有PSD的学位吗? - dp的日志 - 网易博客

    你有PSD的学位吗? - dp的日志 - 网易博客 你有PSD的学位吗? 2011-08-01 12:58:40|  分类: 感悟 |  标签:自我提升   |字号 大中小 订阅       去年, ...

  9. Java内存回收 - 落日之心的日志 - 网易博客

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

随机推荐

  1. JQuery easyui (3) Resizable(调整大小)组件

    Resizable  动态调整元素大小  不依赖其他组件 Resizable的加载方法 <div class="easyui-resizable"></div&g ...

  2. Python进阶之闭包

    闭包 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB","S ...

  3. ExtJS4.x Grid 单元格鼠标悬停提示

    //每一个列都会出现鼠标悬浮上去显示内容 /** * //适用于Extjs4.x * @class Ext.grid.GridView * @override Ext.grid.GridView * ...

  4. composer时间长了,提示需要升级,结果问题来了

    今天重新开始之前的laravel项目,结果composer提示需要升级,于是 composer selfupdate 结果提示无法连接目标库,查阅composer官网,发现之前的库地址已经启用了ssl ...

  5. Flink资料(6) -- 如何添加一个新的Operator

    false false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable {mso-style-n ...

  6. PHP静态成员变量和非静态成员变量

    数据成员可以分静态变量.非静态变量两种. 静态成员: 静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会 ...

  7. c++中多态性、dynamic_cast、父类指针、父类对象、子类指针、子类对象

    c++多态性是依靠虚函数和父类指针指向子类对象来实现的.简单来说,父类中定义虚函数,父类指针指向子类对象,父类指针调用函数时调用的就是子类的函数. 父类没有定义虚函数,父类指针指向子类对象时,父类指针 ...

  8. Linux 安装xtrabackup的依赖问题

    问题: 尝试安装xtrabackup rpm -ivh percona-xtrabackup-2.2.11-1.el7.x86_64.rpm 报错 perl(DBD::mysql) 被 percona ...

  9. HTML5学习笔记之客户端存储数据方法:localStorage(),sessionStorage()

    HTML5提供了两种在客户端存储数据的新方法: localStorage():没有时间限制的数据存储 sessionStorage():针对一个session的数据存储 下面的一个例子用localSt ...

  10. virsh VMI deploy data serial xml

    <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>        <name> ...