用Qt开发Web和本地混合的应用

QtWebkit模块使得Qt widget能够通过HTML的object标签嵌入到web页面中,并通过JavaScript代码进行访问,而Qt对象也能相应的访问web页面元素。
将Qt对象插入到web页面中
首先继承并实现QWebPluginFactory类(C++)

    
    
    
    
class MyPlugin: public QWebPluginFactory { Q_OBJECT public: MyPlugin(QObject* parent = 0); // 当QtWebkit模块解析到HTML中的object标签时被调用 virtual QObject* create(const QString& mimeType, const QUrl& url, const QStringList& argumentNames, const QStringList& argumentValues) const; // 返回该factory支持的plugin virtual QList<Plugin> plugins() const; }; MyPlugin::MyPlugin(QObject* parent) : QWebPluginFactory(parent) { // do nothing } QObject* MyPlugin::create(const QString& mimeType, const QUrl& url, const QStringList& argumentNames, const QStringList& argumentValues) const { QLabel* label = new QLabel(url.toString()); return label; } QList MyPlugin::plugins() const { QList list; QWebPluginFactory::Plugin entry; entry.name = "plugin名"; entry.description = "描述"; list.push_back(entry); return list; }

然后将其嵌入到HTML页面中:

    
    
    
    
<html> <head><title>test</title></head> <body> <object type="application/zxz-plugin" data="http://blog.csdn.net/zhu_xz" width="200" height="100" id="myLabel"></object> </body> </html>

最后,在Qt代码中加载并显示该页面:

    
    
    
    
QWebView view; view.settings()->setAttribute(QWebSettings::PluginsEnabled, true); view.page()->setPluginFactory(new MyPlugin); view.load(QUrl("test.html")); view.show();

这里,当QtWebkit模块解析该HTML文件,遇到object标签时,会自动调用QWebPluginFactory::create()函数,并传递以下参数:
mimeType:application/zxz-plugin
url:http://blog.csdn.net/zhu_xz
此外,还可以通过object标签的param子标签传递参数。

在web页面中访问Qt对象

在web页面中可以通过类似于下的JavaScript代码访问Qt对象:

HTML code
    
    
    
    
<a href="javascript:document.getElementById("myLabel").setText("通过JavaScript访问Qt对象");" mce_href="javascript:document.getElementById("myLabel").setText("通过JavaScript访问Qt对象");">点击访问Qt对象</a>

在Qt对象中访问web页面元素

在QWebPluginFactory::create()函数中添加以下代码:

C/C++ code
    
    
    
    
// myPlugin指向的对象可在HTML中用名字myPluginObject进行访问 webView->page()->mainFrame()->addToJavaScriptWindowObject("myPluginObject", myPlugin); // 当信号signalEmitted被触发时,调用JavaScript的functionToCall函数 webView->page()->mainFrame()->evaluateJavaScript("myPluginObject.signalEmitted.connect(functionToCall);");

你可能感兴趣的:(用Qt开发Web和本地混合的应用)