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();")
