Qt webKit可以做什么(四)——实现本地QObject和JavaScript交互

news/2024/5/18 23:40:27 标签: javascript, webkit, qt, signal, object, web开发
 者: Dawei Cheng 程大伟 (Intel) (10 篇文章) 日期: 六月 9, 2010 在 12:21 下午

上一篇我们了解了如何在webkit中创建含有web内容的本地应用。这一篇我们将实现JavaScript和本地的QObject的交互。在阅读本篇之前需要对Qt的信号和槽机制和JavaScript有简单的了解。
Qt本地对象和JavaScript交互分为三个步骤

    1. 将本地QObject暴露给webkit和JavaScript
    2. 将本地QObject的信号和JavaScript的槽连接起来
    3. 通过JavaScript调用本地QObject的槽

Picture6.png

也就是第1步和第2步结合起来实现 本地QObject的信号和JavaScript的槽连接
第1步和第3步结合起来实现 通过JavaScript调用本地QObject的槽

下面我们就分别看一下第1、2、3步分别如何实现的。

1、将本地QObject暴露给Webkit。主要分为以下几个步骤。

    1. 新建一个QObject, 命名为simpleQObject,包含信号和槽。其头文件如下:
          1. #include <QtCore/QObject>
          2. #include <QtCore/QMap>
          3. #include <QtCore/QString>
          4. #include <QtCore/QVariant>
          5. class SampleQObject : public QObject
          6. {
          7. Q_OBJECT
          8. public:
          9. SampleQObject(QObject *parent = 0);
          10. signals: /* 声明QObject signals */
          11. void signal(QMap<QString, QVariant> object);
          12. public slots: /*声明 QObject slots */
          13. QMap<QString, QVariant> slotThatReturns(const QMap<QString,
          14. QVariant>& object); //QObject 的槽,用来返回字符串
          15. void slotThatEmitsSignal(); //QObject的槽,用来发射信号,并且记录发射次数
          16. private:
          17. int m_signalEmited;
          18. QMap<QString, QVariant> m_returnObject;
          19. QMap<QString, QVariant> m_emitSignal;
          20. };
    2. 创建实现函数。mainwindow.h 和 mainwindow.cpp。 mainwindow.h代码如下
          1. #include <QMainWindow>
          2. #include "sampleqobject.h“
          3. class MainWindow : public QMainWindow {
          4. Q_OBJECT
          5. public:
          6. MainWindow(QWidget *parent = 0);
          7. ~MainWindow();
          8. private slots:
          9. /*声明 将 QObject 暴露给 Qt WebKit 的函数*/
          10. void addJavaScriptObject();
          11. protected:
          12. void changeEvent(QEvent *e);
          13. private:
          14. Ui::MainWindow *ui;
          15. SampleQObject* m_sampleQObject;
          16. };
    3. mainwindow.cpp关键代码如下:
          1. //当网页被载入或者刷新时,将暴露给webkit的QObject和webkit JavaScript连接
          2. connect(ui->webView->page()->mainFrame(),
          3. SIGNAL(javaScriptWindowObjectCleared()),
          4. this, SLOT(addJavaScriptObject()));
          1. void MainWindow::addJavaScriptObject()
          2. {
          3. //addJavaScriptObject函数的实现:将simpleQObject和webkit JavaScript连接
          4. this->ui->webView->page()->mainFrame()->addToJavaScriptWindowObject
          5. ("sampleQObject“, this->m_sampleQObject);
          6. }

2. 将本地QObject的信号和JavaScript的槽连接起来

Picture7.png

    1. 如何发射QObject信号。
          1. signals:
          2. void signal(QMap<QString, QVariant> object);
          3. public slots:
          4. void slotThatEmitsSignal();
          5. /* this slot is designed to emit signals and count emit times*/
          6. void SampleQObject::slotThatEmitsSignal()
          7. {
          8. qDebug() << "SampleQObject::slotThatEmitsSignal";
          9. this->m_signalEmited++; /* count emit times */
          10. this->m_emitSignal.clear();
          11. this->m_emitSignal["signalsEmited"] = QVariant(this->m_signalEmited);
          12. this->m_emitSignal["sender"] = QVariant("SampleQObject::slotThatEmitsSignal");
          13. qDebug() << "SampleQObject::slotThatEmitsSignal" << this->m_emitSignal;
          14. /* 发射信号 */
          15. emit signal(this->m_emitSignal);
          16. }
    2. JavaScript槽的实现
          1. $(document).ready(function() {
          2. try {
          3. /* 将sampleQObjects的signal 和 JavaScript slot 连接起来*/
          4. sampleQObject.signal.connect(slot);
          5. /* 当simpleQObject发射信号时调用JavaScript的槽 */
          6. sampleQObject.slotThatEmitsSignal();
          7. }
          8. catch(e) {
          9. alert(e);
          10. }
          11. });
          12. /* slot函数将会输出 SimpleQObject has emited signal ? times */
          13. function slot(object) {
          14. var objectString = object.sender +
          15. " has emited signal " +
          16. object.signalsEmited +
          17. " times.";
          18. alert(objectString);
          19. }
    3. Run the app。

Picture8.png
当点击刷新时,弹出新的对话框:
Picture9.png

3. 通过JavaScript调用本地QObject的槽
Picture10.png

    1. JavaScript信号发射
          1. try {
          2. var object = {intValue: 1};
          3. /* 声明一个JavaScript object并用simpleQObject的槽的返回值赋值它*/
          4. var returnedObject = sampleQObject.slotThatReturns(object);
          5. /* 输出 "1 added bonus"*/
          6. alert(returnedObject.stringValue);
          7. }
    2. QObject 槽函数
          1. QMap<QString, QVariant> SampleQObject::slotThatReturns(const QMap<QString, QVariant>& object)
          2. {
          3. qDebug() << "SampleQObject::slotThatReturns";
          4. this->m_returnObject.clear();
          5. this->m_returnObject.unite(object);
          6. QString addedBonus = QString::number(object["intValue"].toInt(),
          7. 10).append(" added bonus.");
          8. this->m_returnObject["stringValue"] = QVariant(addedBonus);
          9. qDebug() << "SampleQObject::slotThatReturns" << this->m_returnObject;
          10. return this->m_returnObject; // 返回m_returnObject包含有字符串 1 added bonus
          11. }
    3. Run the app

Picture11.png

本例子代码下载地址: http://software.intel.com/file/28111 http://software.intel.com/file/28112
注:本例子中部分代码来自wiki.forum.nokia.com
http://wiki.forum.nokia.com/index.php/Exposing_QObjects_to_Qt_Webkit
下一篇我们将探索一下如何将S60下的web runtime widget porting至Qt的webkit上来,如今的WRT widget只能依赖于S60的os,如果porting只QT的webkit,那么将可以实现广泛开发者梦寐已久的跨平台功能。

分类: 其他, 移动技术, 英特尔® 软件网络 2.0
标签:Qt, qtwebkit, webkit, web开发


http://www.niftyadmin.cn/n/1748236.html

相关文章

从重采样到数据合成:如何处理机器学习中的不平衡分类问题?

从重采样到数据合成&#xff1a;如何处理机器学习中的不平衡分类问题&#xff1f; 转载自【机器之心】http://www.jiqizhixin.com/article/2499本文作者为来自 KPMG 的数据分析顾问 Upasana Mukherjee 如果你研究过一点机器学习和数据科学&#xff0c;你肯定遇到过不平衡的类分…

QT分析之网络编程(一)

QT分析之网络编程&#xff08;一&#xff09; 2010-07-01 23:19:52| 分类&#xff1a; QT分析之网络编程 | 标签&#xff1a; |字号大中小 订阅 QT分析之网络编程&#xff08;一&#xff09;程序人生 2010-01-28 16:25:53 阅读299 评论0 字号&#xff1a;大中小 首先对W…

CCF NOI1080 统计字符

问题链接&#xff1a;CCF NOI1080 统计字符。 时间限制: 1000 ms 空间限制: 262144 KB 题目描述 Johe最近玩起了字符游戏&#xff0c;规则是这样的&#xff1a;读入四行字符串&#xff0c;其中的字母都是大写的&#xff0c;Johe想打印一个柱状图显示每个大写字母的频率。你能…

QT分析之网络编程(二)

QT分析之网络编程&#xff08;二&#xff09;程序人生 2010-01-31 11:08:42 阅读547 评论0 字号&#xff1a;大中小 前面分析&#xff08;一&#xff09;之前没有看QT自带的文档&#xff0c;看了doc之后对QT的网络体系有一个大致的了解&#xff1a;QNatvieSocketEnginePrivate…

《iOS 8开发指南(第2版)》——第6章,第6.1节MVC模式基础

本节书摘来自异步社区《iOS 8开发指南&#xff08;第2版&#xff09;》一书中的第6章&#xff0c;第6.1节MVC模式基础&#xff0c;作者 管蕾&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 6.1 MVC模式基础iOS 8开发指南&#xff08;第2版&#xff09;当我们…

QT分析之网络编程(三)

QT分析之网络编程&#xff08;三&#xff09;程序人生 2010-01-31 21:45:47 阅读229 评论0 字号&#xff1a;大中小 3、读取信息在QAbstractSocket中&#xff0c;有两个成员是收发数据用的&#xff1a;readData()、writeData()readData()有两种读取方式&#xff1a;有缓冲和无缓…

《PHP和MySQL Web开发从新手到高手(第5版)》一1.4 在Linux下安装

本节书摘来自异步社区《PHP和MySQL Web开发从新手到高手&#xff08;第5版&#xff09;》一书中的第1章&#xff0c;第1.4节&#xff0c;作者【澳】Kevin Yank&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 1.4 在Linux下安装 PHP和MySQL Web开发从新手到高…

Oracle导入SQL脚本执行和常用命令大全

Oracle导入SQL脚本执行和常用命令大全 在工作需要的时候&#xff0c;常常忘记很多命令。今天做的时候才记起&#xff01; 在SQL_PLUS里面执行&#xff1a; sql>full_path/test.sql; 例&#xff1a;sql>D:/test.sql; 不需要commit; 一般都是在test.sql 里面最后加上一…