export qt object to javascript in webkit

本文介绍如何使用Qt的WebView组件实现JavaScript与C++对象之间的交互,包括添加对象、访问属性、调用方法、连接信号等,并提供了参数传递的具体实现。
--添加object到javascript对象中
  webView->page()->mainFrame()->addToJavaScriptWindowObject("formExtractor", this);
        第一个参数是javascript中的名字,第二个参数是对象
  注:必须将上述的添加连接到javaScriptWindowObjectCleared信号,确保每次新页面也会有效
  connect(webView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()),
            this, SLOT(addJavaScriptWindowObjectMethod()));

--javascript访问属性
  cpp中:
      Q_PROPERTY(float blue READ lastBlue);
      float lastBlue();
  javascript中:
      obj.blue

--javascript调用object方法
  cpp中:object方法声明为public slots或者public并使用Q_INVOKABLE来修饰 (signal可以直接调用吗?没有尝试)
  javascript中:使用name.method()调用

--javascript连接object signal
  cpp中:
     public signals:
           void nameChanged();
           void progressChanged(int completed, int total);
  javascript中:
     function onNameChanged() {
     }
     function progress(int complete, int total) {
     }
     function connectSlot() {
         obj.nameChanged.connect(this, onNameChanged);  //disconnect
         obj.progressChanged.connect(this, progress);
     }

--参数的传递:
  函数调用中参数传递支持最基本的类型,复杂类型可以通过QVariant和QVariantMap来包装

  ===使用QVariantMap包装一个结构,javascript中则是Joson来对应

static void unpack(QVariantMap &map, MyStruct *st)
{   
#define Retrieve(name, type, convert, def) \
    if (map.end() != map.find(#name)) \ 
    { \
        st->name = (type)map[#name].convert(); \
    } \
    else \ 
    { \ 
        st->name = def; \
    } 
    Retrieve(name, QString,  toString, "");
    Retrieve(age, int,  toInt, 0);
}
static void pack(QVariantMap &map, MyStruct *st)              
{
    map["name"] = st->name;                  
    map["age"] = st->age;                           
}

  ===使用QVariant包装一个void *指针

static void* unpackPointer(QVariant &var)
{
    long add = var.toLongLong();
    void *p = (void*)add;
    return p;
}
static void packPointer(QVariant &var, void*p)
{
    long add = (int)p;
    var.setValue(add);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值