zoukankan      html  css  js  c++  java
  • Qt调用JS

    转自:

    一、 简介 
    Qt提供了本地C++对象与JavaScript的无缝集成,可以进行本地与web混合应用开发。利用Qt的Webkit集成与QtNetwork模块,可以自由的混合JavaScript、样式表、Web内容和Qt组件。对于C++和javaScript通信,最基本也最复杂的做法是使用COM,本文主要介绍使用Qt提供的QWebView和javaScript进行通信。 
    二、 流程 
     基本函数介绍 
    Qt与JavaScript互调是通过QWebFrame两个函数来实现的:addToJavaScriptWindowObject()将QObject对象传给JS,这样JS就能调用QObject的共有槽函数。Qt通过evaluateJavaScript()直接调用JS中德函数。其流程如下图: 
    这里写图片描述

       函数说明
    1.  void QWebFrame::addToJavaScriptWindowObject(const QString& name, 
    QObject * object)
    第一个参数:name为对象在javaScript里的名字,可以自由命名。
    第二个参数:object对应的QObject实例指针。
    要在JS调用该QObject之前调用这个函数,建议将这个函数放到一个signal的槽函数中调用,其使用代码代码如下:
    connect(ui.webView->page()->mainFrame(),SIGNAL(javaScriptWindowObjectCleared()),this, SLOT(populateJavaScriptWindowObject()));
    相应的槽函数为:
    void 类名::populateJavaScriptWindowObject()
    {
    ui.webView->page()->mainFrame()->addToJavaScriptWindowObject(“formExtractor”, this);
    }
    2.  QVariant QWebFrame::evaluateJavaScript(const QString &scriptSource)
    建立一个工程,拖入一个QWebView,载入html网页,添加一个按钮调用javaScript,其代码为:
    Ui.webView->page()->mainframe()->evaluateJavaScript(“Test()”) ;
    其中Test()为javaScript中的Test()函数。
    附注:如果Qt调用js函数,js函数带有参数,在Qt里该函数调用方法要写成如下形式:
    QString method = QString(“JSFunction(”%1” , ”%2”)”).arg(param1).arg(param2) ;
    Ui.webView->page()->mainframe()->evaluateJavaScript(method) ;
    
    三、  工程示例
    
    新建Qt GUI工程项目QtJS,类名为mainWindow,继承基类选择为QMainWindow。往ui里拖入控件,其布局按如下设置:
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    这里写图片描述

    在mainwindow.cpp中添加头文件#include <QtCore/QUrl>、#include<QtWebK
    itWidgets/QWebView>、#include <QtWebKitWidgets/QWebFrame>、#include<QtW
    ebkit/QWebElement>。在mainwindow.h头文件中添加公有槽函数
        void populateJavaScriptWindowObject() ;//为了保证每次打开新网页或刷新网页时都调用,将该槽函数和javaScriptWindowObjectCleared()信号相连
        void pop1() ; //不传递参数到JavaScript
        void pop2() ;//将Qt中的值传递到JavaScript
        void JsCallQt() ;//JavaScript调用Qt,不传递参数
        void JsCallQt(QStringList str) ;//JavaScript调用Qt,传递参数
    在构造函数中建立信号和槽的连接
    connect(ui.pushButton , SIGNAL(clicked()) , this , SLOT(pop1())) ;
        connect(ui.pushButton_2 , SIGNAL(clicked()) , this , SLOT(pop2())) ;
        connect(ui.webView->page()->mainFrame() , SIGNAL(javaScriptWindow
    -ObjectCleared()) , this , SLOT(populateJavaScriptWindowObject())) ;
    分别添加槽函数的定义:
    void mainWindow::populateJavaScriptWindowObject()
    {
        ui.webView->page()->mainFrame()->addToJavaScriptWindowObject("A" , this) ;
    }
    单击按钮(“不带参数传递到JS”),其效果如下图:
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    这里写图片描述

    弹出对话框为html中的一个警告,其代码如下: 
    在文本框中输入X、Y的值,单击按钮(“带参数传递到JS”),其效果

    这里写图片描述 
    通过JavaScript调用Qt主要有两种方式,第一种:在Qt中定义一个公有的槽函数;第二种:在公有成员函数前添加Q_INVOKABLE宏。 
    添加JsCallQt()的定义如下:

    void mainWindow::JsCallQt(QStringList str)
    {
       ui.lineEdit_3->setText(str[0]) ;
       ui.lineEdit_4->setText(str[1]) ;
    }
    void mainWindow::JsCallQt()
    {
        QWebFrame *frame = ui.webView->page()->mainFrame();
        QWebElement X = frame->findFirstElement("#X");
        ui.lineEdit_3->setText(X.evaluateJavaScript("this.value").toString()) ;
        QWebElement Y = frame->findFirstElement("#Y");
        ui.lineEdit_4->setText(Y.evaluateJavaScript("this.value").toString()) ;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    JsCallQt()的两个版本分别对应html中的两个按钮,推荐使用第二种方式。第一种带参数传递时,好像需要在javascript中将变量设置为数组,传递多个参数时好像会失效(有兴趣可以验证)。 
    单击html中的按钮(“第二种方式传递到Qt”),其显示效果如下图: 
    这里写图片描述

    一、 简介 
    Qt提供了本地C++对象与JavaScript的无缝集成,可以进行本地与web混合应用开发。利用Qt的Webkit集成与QtNetwork模块,可以自由的混合JavaScript、样式表、Web内容和Qt组件。对于C++和javaScript通信,最基本也最复杂的做法是使用COM,本文主要介绍使用Qt提供的QWebView和javaScript进行通信。 
    二、 流程 
     基本函数介绍 
    Qt与JavaScript互调是通过QWebFrame两个函数来实现的:addToJavaScriptWindowObject()将QObject对象传给JS,这样JS就能调用QObject的共有槽函数。Qt通过evaluateJavaScript()直接调用JS中德函数。其流程如下图: 
    这里写图片描述

       函数说明
    1.  void QWebFrame::addToJavaScriptWindowObject(const QString& name, 
    QObject * object)
    第一个参数:name为对象在javaScript里的名字,可以自由命名。
    第二个参数:object对应的QObject实例指针。
    要在JS调用该QObject之前调用这个函数,建议将这个函数放到一个signal的槽函数中调用,其使用代码代码如下:
    connect(ui.webView->page()->mainFrame(),SIGNAL(javaScriptWindowObjectCleared()),this, SLOT(populateJavaScriptWindowObject()));
    相应的槽函数为:
    void 类名::populateJavaScriptWindowObject()
    {
    ui.webView->page()->mainFrame()->addToJavaScriptWindowObject(“formExtractor”, this);
    }
    2.  QVariant QWebFrame::evaluateJavaScript(const QString &scriptSource)
    建立一个工程,拖入一个QWebView,载入html网页,添加一个按钮调用javaScript,其代码为:
    Ui.webView->page()->mainframe()->evaluateJavaScript(“Test()”) ;
    其中Test()为javaScript中的Test()函数。
    附注:如果Qt调用js函数,js函数带有参数,在Qt里该函数调用方法要写成如下形式:
    QString method = QString(“JSFunction(”%1” , ”%2”)”).arg(param1).arg(param2) ;
    Ui.webView->page()->mainframe()->evaluateJavaScript(method) ;
    
    三、  工程示例
    
    新建Qt GUI工程项目QtJS,类名为mainWindow,继承基类选择为QMainWindow。往ui里拖入控件,其布局按如下设置:
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    这里写图片描述

    在mainwindow.cpp中添加头文件#include <QtCore/QUrl>、#include<QtWebK
    itWidgets/QWebView>、#include <QtWebKitWidgets/QWebFrame>、#include<QtW
    ebkit/QWebElement>。在mainwindow.h头文件中添加公有槽函数
        void populateJavaScriptWindowObject() ;//为了保证每次打开新网页或刷新网页时都调用,将该槽函数和javaScriptWindowObjectCleared()信号相连
        void pop1() ; //不传递参数到JavaScript
        void pop2() ;//将Qt中的值传递到JavaScript
        void JsCallQt() ;//JavaScript调用Qt,不传递参数
        void JsCallQt(QStringList str) ;//JavaScript调用Qt,传递参数
    在构造函数中建立信号和槽的连接
    connect(ui.pushButton , SIGNAL(clicked()) , this , SLOT(pop1())) ;
        connect(ui.pushButton_2 , SIGNAL(clicked()) , this , SLOT(pop2())) ;
        connect(ui.webView->page()->mainFrame() , SIGNAL(javaScriptWindow
    -ObjectCleared()) , this , SLOT(populateJavaScriptWindowObject())) ;
    分别添加槽函数的定义:
    void mainWindow::populateJavaScriptWindowObject()
    {
        ui.webView->page()->mainFrame()->addToJavaScriptWindowObject("A" , this) ;
    }
    单击按钮(“不带参数传递到JS”),其效果如下图:
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    这里写图片描述

    弹出对话框为html中的一个警告,其代码如下: 
    在文本框中输入X、Y的值,单击按钮(“带参数传递到JS”),其效果

    这里写图片描述 
    通过JavaScript调用Qt主要有两种方式,第一种:在Qt中定义一个公有的槽函数;第二种:在公有成员函数前添加Q_INVOKABLE宏。 
    添加JsCallQt()的定义如下:

    void mainWindow::JsCallQt(QStringList str)
    {
       ui.lineEdit_3->setText(str[0]) ;
       ui.lineEdit_4->setText(str[1]) ;
    }
    void mainWindow::JsCallQt()
    {
        QWebFrame *frame = ui.webView->page()->mainFrame();
        QWebElement X = frame->findFirstElement("#X");
        ui.lineEdit_3->setText(X.evaluateJavaScript("this.value").toString()) ;
        QWebElement Y = frame->findFirstElement("#Y");
        ui.lineEdit_4->setText(Y.evaluateJavaScript("this.value").toString()) ;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    JsCallQt()的两个版本分别对应html中的两个按钮,推荐使用第二种方式。第一种带参数传递时,好像需要在javascript中将变量设置为数组,传递多个参数时好像会失效(有兴趣可以验证)。 
    单击html中的按钮(“第二种方式传递到Qt”),其显示效果如下图: 
    这里写图片描述

  • 相关阅读:
    thymeleaf时间戳转换
    alerttemplate 时间戳转换
    jQuery.Deferred exception: a.indexOf is not a function TypeError: a.indexOf is not a function
    区分数据是对象还是字符串
    eclipse中选取一列快捷键
    图片拉伸不变型
    这里ajax需要改成同步
    idea如何整理代码格式
    20170311-起早床
    20190310-解决头屑
  • 原文地址:https://www.cnblogs.com/zhangxuan/p/7576829.html
Copyright © 2011-2022 走看看