上一篇我們了解了如何在webkit中創(chuàng)建含有web內(nèi)容的本地應(yīng)用。這一篇我們將實現(xiàn)JavaScript和本地的QObject的交互。在閱讀本篇之前需要對Qt的信號和槽機(jī)制和JavaScript有簡單的了解。
Qt本地對象和JavaScript交互分為三個步驟
- 將本地QObject暴露給webkit和JavaScript
- 將本地QObject的信號和JavaScript的槽連接起來
- 通過JavaScript調(diào)用本地QObject的槽
也就是第1步和第2步結(jié)合起來實現(xiàn) 本地QObject的信號和JavaScript的槽連接
第1步和第3步結(jié)合起來實現(xiàn) 通過JavaScript調(diào)用本地QObject的槽
下面我們就分別看一下第1、2、3步分別如何實現(xiàn)的。
1、將本地QObject暴露給Webkit。主要分為以下幾個步驟。
- 新建一個QObject, 命名為simpleQObject,包含信號和槽。其頭文件如下:
- #include <QtCore/QObject>
- #include <QtCore/QMap>
- #include <QtCore/QString>
- #include <QtCore/QVariant>
- class SampleQObject : public QObject
- {
- Q_OBJECT
- public:
- SampleQObject(QObject *parent = 0);
- signals: /* 聲明QObject signals */
- void signal(QMap<QString, QVariant> object);
- public slots: /*聲明 QObject slots */
- QMap<QString, QVariant> slotThatReturns(const QMap<QString,
- QVariant>& object); //QObject 的槽,用來返回字符串
- void slotThatEmitsSignal(); //QObject的槽,用來發(fā)射信號,并且記錄發(fā)射次數(shù)
- private:
- int m_signalEmited;
- QMap<QString, QVariant> m_returnObject;
- QMap<QString, QVariant> m_emitSignal;
- };
- 創(chuàng)建實現(xiàn)函數(shù)。mainwindow.h 和 mainwindow.cpp。 mainwindow.h代碼如下
- #include <QMainWindow>
- #include "sampleqobject.h“
- class MainWindow : public QMainWindow {
- Q_OBJECT
- public:
- MainWindow(QWidget *parent = 0);
- ~MainWindow();
- private slots:
- /*聲明 將 QObject 暴露給 Qt WebKit 的函數(shù)*/
- void addJavaScriptObject();
- protected:
- void changeEvent(QEvent *e);
- private:
- Ui::MainWindow *ui;
- SampleQObject* m_sampleQObject;
- };
- mainwindow.cpp關(guān)鍵代碼如下:
- //當(dāng)網(wǎng)頁被載入或者刷新時,將暴露給webkit的QObject和webkit JavaScript連接
- connect(ui->webView->page()->mainFrame(),
- SIGNAL(javaScriptWindowObjectCleared()),
- this, SLOT(addJavaScriptObject()));
- void MainWindow::addJavaScriptObject()
- {
- //addJavaScriptObject函數(shù)的實現(xiàn):將simpleQObject和webkit JavaScript連接
- this->ui->webView->page()->mainFrame()->addToJavaScriptWindowObject
- ("sampleQObject“, this->m_sampleQObject);
- }
2. 將本地QObject的信號和JavaScript的槽連接起來
- 如何發(fā)射QObject信號。
- signals:
- void signal(QMap<QString, QVariant> object);
- public slots:
- void slotThatEmitsSignal();
- /* this slot is designed to emit signals and count emit times*/
- void SampleQObject::slotThatEmitsSignal()
- {
- qDebug() << "SampleQObject::slotThatEmitsSignal";
- this->m_signalEmited++; /* count emit times */
- this->m_emitSignal.clear();
- this->m_emitSignal["signalsEmited"] = QVariant(this->m_signalEmited);
- this->m_emitSignal["sender"] = QVariant("SampleQObject::slotThatEmitsSignal");
- qDebug() << "SampleQObject::slotThatEmitsSignal" << this->m_emitSignal;
- /* 發(fā)射信號 */
- emit signal(this->m_emitSignal);
- }
- JavaScript槽的實現(xiàn)
- $(document).ready(function() {
- try {
- /* 將sampleQObjects的signal 和 JavaScript slot 連接起來*/
- sampleQObject.signal.connect(slot);
- /* 當(dāng)simpleQObject發(fā)射信號時調(diào)用JavaScript的槽 */
- sampleQObject.slotThatEmitsSignal();
- }
- catch(e) {
- alert(e);
- }
- });
- /* slot函數(shù)將會輸出 SimpleQObject has emited signal ? times */
- function slot(object) {
- var objectString = object.sender +
- " has emited signal " +
- object.signalsEmited +
- " times.";
- alert(objectString);
- }
- Run the app。
當(dāng)點擊刷新時,彈出新的對話框:
3. 通過JavaScript調(diào)用本地QObject的槽
- JavaScript信號發(fā)射
- try {
- var object = {intValue: 1};
- /* 聲明一個JavaScript object并用simpleQObject的槽的返回值賦值它*/
- var returnedObject = sampleQObject.slotThatReturns(object);
- /* 輸出 "1 added bonus"*/
- alert(returnedObject.stringValue);
- }
- QObject 槽函數(shù)
- QMap<QString, QVariant> SampleQObject::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
- }
- Run the app
本例子代碼下載地址: 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,那么將可以實現(xiàn)廣泛開發(fā)者夢寐已久的跨平臺功能。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。