QtWebkit本地C++与JavaScript数据对接
QtWebKitBridge已经实现了本地C++与JavaScript数据对接,这些对接对程序员来可以说是透明的,转换隐式的。它巧妙的利用的Qt的万能类型QVariant。
数据类型对接表,另外QTimeQDate也会与javascript的时间日期进行自动转换。
java类型 | Qt C++ 类型 |
javaType | QVariant |
javaArray | QVariantList |
JsonObject | QVariantMap |
JsonObjectArray | QVariantList+QvariantMap |
注:详细也参考http://doc.qt.nokia.com/4.7-snapshot/qtwebkit-bridge.html
一般数据的对接
Javascript调用示例
varvol = '32';
setVolume(vol);
Qt&&c++对接示例
//利用隐式转换 bool setVolume(int vol) { //使用隐式转换的整形,如果不能转换将默认转换成0, //所以0是正常值或非法值,如果关心数据的合法性可以使用以下面的方法解决 return doSomeThing(vol); } //使用更安全的机制 bool setVolume(const QVariant & vol) { //判断万能数据的合法性,是否为int if(vol.canConvert(QVariant::Int)) { //如果是合法的int 将时行转换; int n = vol.toInt(); return doSomeThing(n); } else { return false; } }
Json 数据的对接
Javascript调用示例,处理返回的Json对象数组
var files = getFileAll(); var i; for(i = 0; i < files.length; i++) { alert("name:"+files[i].name+" type:"+files[i].type+" size:"+files[i].size); }
Qt&&c++对接示例,把数据用QVariantMap封成Json对象,放入数组返回
QVariantList FileSys::list() { QVariantList list; QFileInfoList filelist; qDebug()<<"=====>filepath:"<<d->path(); filelist = d->entryInfoList(QDir::NoDotAndDotDot|QDir::Dirs|QDir::Files); //开始对数据进行逐个封装 foreach(const QFileInfo& file,filelist) { //封装成Map与JSon 对接 QVariantMap map; map["name"]=file.fileName();//字符串型 map["type"]=file.isDir();//bool 型 map["size"]=file.size();//整型 //将数据放入列表中 list<<map; } //返回数据,对接层会将其转换为JSON格式 return list; }