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

来源:互联网 发布:url隐藏端口号 编辑:程序博客网 时间:2024/05/23 13:03

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.getElementByIdx_x("myLabel").setText("通过JavaScript访问Qt对象");" mce_href="javascript:document.getElementByIdx_x("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);");