QT实现预编译的浏览器插件 JS与QT对象进行交互

来源:互联网 发布:淘宝如何看自己退货率 编辑:程序博客网 时间:2024/05/16 05:29
JS与QT对象进行交互,顾名思义,就是将QT对象和JS对象相关联,然后JS可以调用QT对象的方法并返回值,反之QT可以调用JS的方法(回调)。

1,把QT对象加入到JS中,并实现JS调用QT对象。

// 实现一个新类  class QFoo : public QObject  {  Q_OBJECT  public:  QFoo(QObject *parent) {}  void initialize(QWebView *wv);    public slots:  void print(const QString &msg);    private slots:  void addObject();    private:  QWebFrame *wf;  };    void QFoo::initialize(QWebView *wv)  {  wf = wv->page()->mainFrame();  // Add to the javascript window object  addObject();  // connect the signal for javascript window object cleared, which happened  // at page switching etc.  connect(wf, SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(addObject()));  }    void QFoo::addObject()  {  wf->addToJavaScriptWindowObject(QString("QFoo"), this);  }    void QFoo::print(const QString &msg)  {  qDebug() << "Output the message " << msg;  }  

测试主函数  
int main(int argc, char *argv[])  {  QApplication test(argc, argv);    QWebView *wv = new QWebView();    QFoo *foo = new QFoo(wv);  foo->initialize(wv);    wv->setUrl(QUrl("foo.html"));  wv->show();    return test.exec();  }  


HTML测试代码:

<script>QFoo.print("Hello world!");</script>


/*****************************************************************/
2,通过将本地QT的信号和JS的槽连接起来的方式,实现QT对象调用JS(回调)

//定义QT对象class WebApp : public QObject{    Q_OBJECTpublic:    WebApp(QObject *parent){}    void initialize(QWebView *wv);signals: //定义QT信号    void launchSignal(QString obj);    void getAppListSignal(QString obj);public slots:    void launch(const QString &appName);    void getAppList();private slots:    void addObject();private:    QWebFrame *wf;};//QT对象如何发射信号void WebApp::launch(const QString &appName){    QString url = "";    if(appName == "EManual"){        url = "{\"ip\":\"192.168.42.129\",\"port\":\"12100\"}";    }else if(appName == "DBA"){        url = "{\"ip\":\"192.168.42.129\",\"port\":\"12102\"}";    }    /* send signal */    emit launchSignal(url);}

HTML测试代码


<script>webapp.launchSignal.connect(launchCallBack);webapp.launch("EManual");function launchCallBack(object){    var msg = JSON.parse(object);    var url = "http://" + msg.ip + "/" + msg.port;    window.location.href = url;}</script>

3,实现JS对象调用QT 返回的为JS对象而不是JSON串

//定义QT对象class WebApp : public QObject{    Q_OBJECTpublic:    WebApp(QObject *parent){}    void initialize(QWebView *wv);public slots://定义槽函数,其可以返回和接受JS对象    QMap<QString, QVariant> slotThatReturns(const QMap<QString,QVariant>& object);private slots:    void addObject();private:    QWebFrame *wf;//返回的JS对象    QMap<QString, QVariant> m_returnObject;};//返回对象QMap<QString, QVariant> WebApp::slotThatReturns(const QMap<QString,QVariant>& object){    qDebug() << "SampleQObject::slotThatReturns";    this->m_returnObject.clear();    this->m_returnObject.unite(object);    QString addedBonus = QString::number(object["intValue"].toInt(),    10).append(" added bonus.");    this->m_returnObject["stringValue"] = QVariant(addedBonus);    qDebug() << "SampleQObject::slotThatReturns" << this->m_returnObject;    return this->m_returnObject; // 返回m_returnObject包含有字符串 1 added bonus}

HTML测试代码
<script>var object = {intValue: 1};var returnedObject = webapp.slotThatReturns(object);alert(returnedObject.stringValue);</script>


/*****************************************************************/
4,另一种方式实现QT对象调用JS对象(回调)

//定义QT对象class WebApp : public QObject{    Q_OBJECTpublic:    WebApp(QObject *parent){}    void initialize(QWebView *wv);public slots://定义槽函数,其可以返回和接受JS对象    void getAsynCallBack(const QString &type,const QString &success,const QString $error);private slots:    void addObject();private:    QWebFrame *wf;};//函数实现void Vehicle::getAsynCallBack(const QString &type,const QString &success,const QString $error){    QString msg = "";    //此处省略n行    if(error)    {        qDebug() << "error! " << msg;        msg = "{\"status\":\"error\",\"errorid\":\"-1\"}";        wf->evaluateJavaScript("error('" + msg + "')");    }    else    {qDebug() << "error! " << msg;msg  = "{\"status\":\"ok\"}";        wf->evaluateJavaScript("success('" + msg + "')");    }}

HTML测试代码


<script>vehicle.getAsynCallBack("vehicle_info_fuel_type",success,error);function success(data){alert(data);}function error(data){alert(data);}</script>


参考文档:
http://www.cnblogs.com/ziqiuqiandao/archive/2012/12/29/2838652.html

http://blog.csdn.net/myaccella/article/details/6956534

http://software.intel.com/zh-cn/blogs/2010/06/09/qt-webkitqobjectjavascript/
原创粉丝点击