首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

嵌入式linux智能设备中web支持的实现(4)

嵌入式linux智能设备中web支持的实现(4)

清单 7. 设置编辑框内容的代码实现
                                 QWebFrame *frame = form.WebView->page()->mainFrame();  QString code = getScanCode ();    // 调用扫描条形码的功能,需要自己实现 QString js = QString ("document.getElementById('code').value =\"%1\";" ).arg(code) );  frame->evaluateJavaScript ( js );

接下来可以用下面语句来实现触发 query 按钮:

清单 8. 触发 query 按钮的代码实现
                                 QWebFrame *frame = form.WebView->page()->mainFrame();  QString js =  QString ( "document.getElementById('query').submit();" );  frame -> evaluateJavaScript ( js );

除了可以设置网页上编辑框内容外,我们还可以通过下面的语句获取编辑框中的内容:

清单 9. 获取编辑框内容的代码实现
                                 QWebFrame *frame = form.WebView->page()->mainFrame();  QString s1 = frame->evaluateJavaScript ("document.getElementById ('code').name" );

这样就解决了条码机的货物查询功能所碰到的问题。我们可以让页面随时运行我们自定义的 JavaScript,这个功能将发挥非常大的作用。它实际上解决了在由设备进行主动触发的的应用模式下,本地代码和网页进行配合的问题。但是这个方法只能用于特定的网页,因为我们自己插入的 JavaScript 必须与网页上运行环境匹配。
自定义 JavaScript 扩展的方法
接着我们介绍第三种应用场景:我们先考虑这样一个问题,如果页面的 JavaScript 代码中需要得到本地应用的支持怎么办?比如一个机顶盒软件需要配置本地网络(这种应用原本都是编写本地应用程序实现的,但是既然我们讨论采用 Web 方法来代替原有开发模式,就需要考虑如何在 Web 上实现)。首先,页面需要获取当前网络设置方式,IP 地址、子网掩码、DNS 等。在网页上的编辑框、下拉框等控件内显示,用户做了一些配置之后,点击网页上的“确定”按钮,这些配置信息就生效了。
从页面的角度来说,这些都需要用 JavaScript 代码来实现,那么我们就需要让 JavaScript 代码能和本地代码关联起来。Qt 支持自定义的 JavaScript 扩展,也就是说用户可以自己在 Qt 中定义一个对象,编译到 WebKit 中。页面中的 JavaScript 脚本可以直接生成这个对象并且调用其方法。Qt 在目录 \src\3rdparty\WebKit\WebCore\bridge\ 中提供了一个 demo。测试代码在文件 testqtbindings.cpp 中。我们可以参考他的方法的编写自定义的类:

清单 10. 自定义类的实现代码
                                 class MyObject : public QObject  {  Q_OBJECT  //   定义属性和函数的关联    Q_PROPERTY ( QString ip READ ip WRITE setIp )   public:     MyObject (){}     QString ip ()     {         // 以字符串方式返回 IP 地址的实现    };     void setIp( QString )     {         // 设置 IP 地址的实现    };  };  // 通过如下的代码来生成对象实例: MyObject* myObject = new MyObject;

然后用下面的方法实现对象 myObject 和 JavaScript 中的对象 myInterface 的关联:

清单 11. C++ 对象和 JavaScript 对象的关联代码
                                 Global* global = new Global ();  RefPtr<Interpreter> interp = new Interpreter ( global );  ExecState* exec = interp->globalExec ();  // 实现 C++ 对象和 JavaScript 对象的关联 global->put ( exec, Identifier("myInterface" ), Instance::createRuntimeObject (                                  Instance:tLanguage, (void*)myObject) );

将 MyObject 的定义在 QWebFrame.h 中声明,并且将清单 11 中的代码加入到 QWebFrame 的构造函数中(QWebFrame.cpp)。QWebFrame.h 和 QWebFrame.cpp 两个文件在目录 src\3rdparty\WebKit\WebKit\qt\Api 下。重新编译 WebKit 模块之后,在网页中就可以使用 myInterface 来调用对象 myObject 的方法了。调用的 JavaScript 代码如下:
需要获取 ip 的时候:
str = myInterface.ip;
需要设置 ip 的时候:
myInterface.Ip = str;
上面的代码只是 ip 地址获取和设置示例,其他类似掩码、dns 之类可以使用类似的方法。
任何嵌入式智能设备的用 C/C++ 实现的本地功能,都可以通过上述方法让 JavaScript 来进行调用。这种扩展能让浏览器来解释执行任何我们想要的功能,几乎让 Web 和本地代码的结合完全扫除了障碍。将实现具体功能的本地代码封装成为库和模块,然后由 Web 来进行上层架构和耦合,这将大大降低嵌入式 Linux 智能设备的软件开发难度。特别是对于经常要更新功能的应用,以前需要刷新 Firmware,而现在只要更新远程服务器上的网页就可以了。
编写 WebKit plugin 的方法
除了自定义 JavaScript 对象之外,有时候我们还会用到自定义的网页元素。在 PC 上,最典型的网页元素就是 FLASH。FLASH 并不是 HTML 标准,但是可以用插件的方式让浏览器对这些特定的标签进行解释。
最后一种应用场景:以广告机为例,之前我们提到过广告机的视频播放功能。不同平台播放视频的方式都是不同的,而网页也没有像定义图片一样定义视频播放的标准,因此广告机作为区别于 PC 的嵌入式设备,其视频播放功能必须用本地代码来实现。当我们用网页方式来组织广告机的屏幕,视频部分就应该像图片、文字一样,成为网页中的一个部分,可以通过 HTML 的定义来控制。HTML 提供了标签“object”,来方便实现一些特别的对象。比如:
< object data="yahtzee.gif" type="image/gif" title="A Yahtzee animation"                                  width=200 height=100 >

如果我们的浏览器支持我们用类似方法在网页中插入一个自定义对象,那么这个问题就可以得到解决。
Qt 支持在 WebKit 中添加自定义的插件。在文件 FrameLoaderClientQt.cpp 中的函数 FrameLoaderClientQt::createPlugin 中,可以找到如下的代码片段:

清单 12. FrameLoaderClientQt.cpp 代码片段
                                 if ( mimeType == "application/x-qt-plugin"    || mimeType == "application/x-qt-styled-widget" )  {         object = m_WebFrame->page()->createPlugin( classid, qurl, params, values );

通过上面的代码,可以看出如果 HTML 中一个 object 将自己的 type 设置为 application/x-qt-plugin 或者是 application/x-qt-styled-widget,Qt 则会识别并要求 QWebPage 来创建插件,其方式就是调用 QWebPage 的 createPlugin 函数,函数定义如下:
QObject *QWebPage::createPlugin ( const QString &classid, const QUrl &url,      const QStringList &paramNames, const QStringList &paramValues );

我们设计以下的 HTML 来标识我们的对象:
<object type="application/x-qt-plugin" classid="VideoPlayer" width=800                      height=600 file="kfc.avi" ></object>

我们设定了在网页中插入一个 VideoPlaye 的对象,并且设定了宽高、要播放的文件等参数。因为我们设定了这个对象的 type 为 application/x-qt-plugin,所以当浏览器碰到这段 HTML 代码时,会调用到 QWebPage 的 createPlugin 功能。这个函数被要求返回一个窗体。而这个窗体会被当成一个标准网页对象,和编辑框、下拉框等一样被嵌入到 Web 页面中。
我们先从 QWebPage 中派生自己的对象,实现 createPlugin:
继承事业,薪火相传
返回列表