JS與Qt對象交互:
JS->Qt:創建一個插件,然后在網頁中使用embed標簽嵌入Qt控件,它的所有public slots就像普通函數一樣被網頁中的JavaScript函數訪問。
Qt->JS:網頁加載JS函數完成后,Qt程序通過evaluateJavaScript函數就可以執行JS函數。
JS->Qt:
1)定義一個插件類,繼承於QObject和WebKitPluginInterface:
1 class EPGPLUGINSHARED_EXPORT EpgPlugin : public QObject, public WebKitPluginInterface {
2 Q_OBJECT
3 Q_INTERFACES(WebKitPluginInterface) //聲明WebKitPluginInterface是一個接口
4 public:
5 EpgPlugin();
6 ~EpgPlugin();
7 protected:
8 QList<QWebPluginFactory::Plugin> plugins() const;
9 QObject *create(const QString &mimeType,
10 const QUrl &url,
11 const QStringList &argumentNames,
12 const QStringList &argumentValues) const;
13 void setWebView(QWebView *webView) {this->webView = webView;}
14 QWebView *webView;
15 private:
16 EpgDemo *label;//Qt控件
17 };
2)實現的plugins方法,告訴瀏覽器插件支持的mimeType:
1 QList<QWebPluginFactory::Plugin> EpgPlugin::plugins()const
2 {
3
4 QWebPluginFactory::MimeType mimeType1;
5 mimeType1.name="application/x-qt-label";//添加插件支持的mimeType
6 mimeType1.description=QObject::tr("label");
7
8 QList<QWebPluginFactory::MimeType> mimeTypes;
9 mimeTypes.append(mimeType1);
10
11 QWebPluginFactory::Plugin plugin;
12 plugin.name=QObject::tr("epg plugin");
13 plugin.description=QObject::tr("epg plugin");
14 plugin.mimeTypes=mimeTypes;
15
16 QList<QWebPluginFactory::Plugin> plugins ;
17 plugins.append(plugin);
18 return plugins;//返回插件
19 }
3)實現的create方法,給瀏覽器返回Qt控件:
1 QObject *EpgPlugin::create(const QString &mimeType,
2 const QUrl &url,
3 const QStringList &argumentNames,
4 const QStringList &argumentValues) const
5 {
6 qDebug() << "EpgPlugin::create";
7 Q_UNUSED(argumentNames);
8 Q_UNUSED(argumentValues);
9
10 label->webView = webView;
11 label->setPixmap(QPixmap("/opt/test.bmp"));
12 return label;//返回Qt控件
13 }
4)自定義的控件類:
1 class EpgDemo : public QLabel
2 {
3 Q_OBJECT
4 public:
5 EpgDemo();
6 ~EpgDemo();
7 void hide();
8 public slots:
9 void version();
10 int getId(int id);
11 public:
12 QWebView *webView;
13 };
5)HTML中,Qt控件使用embed標簽創建:
1 <embed type="application/x-qt-label" id='label' units="pixels" height=200 width=200 />
JS可以使用document.getElementById("label")獲取到Qt控件的對象,然后就可以直接調用該對象的public slots方法。
1 function getId(var1)
2 {
3 ret=document.getElementById("label").getId(var1);
4 alert(ret);
5 }
或
1 <a href='javascript:document.getElementById("label").version();'>Change color!</a>
Qt->JS:
1)JS函數:
1 function helloWorld()
2 {
3 alert("hello,world!");
4 }
2)Qt調用:
1 webView->page()->mainFrame()->evaluateJavaScript("helloWorld();")
