zoukankan      html  css  js  c++  java
  • 利用QT进行web与本地混合应用开发转载

    [T] 利用QT进行web与本地混合应用开发

     Qt Features for Hybrid Web/Native Application Development。
    原文参见 http://www.qtsoftware.com/forms/whitepapers/reg-whitepaper-hybrid. (限于本人英文水平,只译其大概)


    Qt提供了本地 C++对象与JavaScript的无缝集成,是进行本地与web混合应用开发的理想平台。


    (
    一)Qt Webkit 集成
       利用QtWebkit 集成与QtNetwork模块,你完全可以进行本地桌面与web混合应用开发,你可以自由地混合JavaScript,样式表,Web内容和Qt组件。 Webkit是一个非常成熟的web浏览引擎。Qt中集成了这个大名鼎鼎的引擎,通过QtWebkit,你可以在C++ 中执行JavaScript,或者在网页中集成C++对象,并且通过JavaScript和这些对象进行交互。
      一个现代的HTML渲染引擎只 是混合开发的一半,另一半就是本地应用和渲染对象的交互。QT的Webkit 集成提供了这种解决方案:
      1.使用object标签嵌入Qt Widgets组件。这可以让使用C++代码的Qt组件包含在网页中,作为网页的部分外观。
      2.JavaScript中访问C++对象。你 可以在JavaScript环境中插入C++对象,让网页脚本直接访问你的数据结构。
      3.Qt中执行JavaScript。你可以在C++ 调用网页环境中的JavaScript函数,触发网页事件。
      4.共享客户端存储。在JavaScript和C++中你都具有访问数据库的能 力,这样当下线时也能共享大量数据。


    (
    二)与嵌入的Qt对象交互
      使用 QWebView 组件,有两种方法可以在网页中嵌入C++对象。你可以在网页的JavaScript中添加C++对象,或者也可以创建一个插件,然后在网页中使用 object标签嵌入。
      
      第二种方法更容易入手。当在网页中放入 Widget组件时,它的所有public slots就像普通函数一样被网页中的JavaScript函数访问。
       
    要在网页中添加一个Widget,首先要告诉你的QWebPage对象,Widget可用,这个通过子类化QWebPlugFactory完成,你需要 重新实现两个方法:plugscreateplugs方法通知网页该Widget可用,create方法根据请求创建widget
      在 HTML网页中,widgets使用object标签创建。比如,下面这个标签试图创建一个 application/x-qt-colorlabel 组件。

    <object type="application/x-qt-colorlabel" width="50px" height="20px" id="label" />


      要利用这种创建,必须要允许使用插件并且要告诉QWebpage插件的工厂类。在下面的代码中,ColorLabelFactory将 会根据application/x-qt-colorlabel的请求创建相应实例。

    QWebSettings::globalSettings()->setAttribute(QWebSettings::PluginsEnabled, true); 
    webView->page()->setPluginFactory(new  ColorLabelFactory(this));


      ColorLabel有一个公开的slot: chagneColor(),这个对于网页中的JavaScript自动可用。在网页中插入一个指向该元素的链接,可以以一种简单的方式激活C++函数。

    <a href='javascript:document.getElementById("label").changeColor();'>Change color!</a> 

     
     
      要反方向推进事件,必须要使你的对象在JavaScript文档上下文中可用。要对QWebPage的每一个 QWebFrame,调用addToJavaScriptWindowObject方法。这个方法允许你根据名字把一个对象添加到JavaScipt上下 文中。

    webView->page()->mainFrame()->addToJavaScriptWindowObject( "eventSource", new eventSource( this ) );


      要连接刚添加对象eventSource的信号,要加上一段JavaScript代码,使用evaluateJavaScript方法 完成。下面的代码将把eventSource对象的signalName信号连接到一个JavaScript函数destFunction。

    webView->page()->mainFrame()->evaluateJavaScript( "eventSource.signalName.connect(destFunction);" );



      如果你把一个对象添加到一个以标准浏览器查看的JavaScript页面中,有一个信号需要知道。每一次JavaScript 内容被清除,Frame都会释放 javaScriptWindowObjectCleared 信号。为了使你的Qt对象一直可用,你需要连接这个信号,并且在这里调用 addToJavaScriptWindowObject函数。

     

    (二)使用客户端存储共享数据

           随着HTML5,WEB标准日益靠近于桌面,同样,桌面也开始集成WEB。这方面一个最大的变化就是客户端存储。这在客户机上给了每一方(比如每一个页 面)一个能利用SQL的数据库引擎,可以缓存本地数据,减少流量,使页面能脱机使用。还可以用来存储大量的结构化的,可搜索的数据。

          客户端存储可以在JavaScript中使用,从JavaScript代码中搜索数据库,然后从搜索结果中生成页面。这要使用 openDatabase和transaction函数。

    假设现在有个数据库, 代码如下所示:

    db = openDatabase("TestDb ", "1.0", "Client side storage test", 200000);
    db.transaction(function(tx) {
          tx.executeSql("SELECT id, text FROM Texts", [], function(tx, result) {
              for (var i = 0; i < result.rows.length; ++i) {
                  var row = result.rows.item(i);
                   processText( row['id'], row['text'] );
             }
        },    function(tx, error) {
             alert('Failed to retrieve texts from the database - ' + error.message);
             return;
        });
    });

         使用QtWebkit,你可以使用QtSql模块访问同一个数据库。这在混合开发中是一个非常有用的特征。比如,你的应用中的web页面在和本地部分共享 数据时,可以用同样的机制来保存数据。
         为了避免安全问题,客户端的数据库只能由具有正确权限的一方在JavaScript中访问。本地的C++代码也可以通过静态的
    QWebSecurityOrigin::allOrigins 方法,或者通过QWebFrame::securityOrigin 来访问所有安全对象
       

           通过databases方法,可以访问一个 QWebDatabaew方法列表,每一个web数据库对象有一个filename属性,可以用来在本地代码中访问数据库。

    QWebDatabase webdb = mySecurityOrigin.databases()[index];
    QSqlDatabase sqldb = QSqlDatabase::addDatabase("QSQLITE", "webconnection");
    sqldb.setDatabaseName(webdb.fileName());
    if (sqldb.open()) {

        QStringList tables = sqldb.tables();
      
    }


             在WEB和本地应用连接事件的能力,再加上共享数据的机制,更易于模糊WEB和桌面之间的界限。



    (三)WEB转换

           很多通过WEB得到的数据并不适合直接显示。比如网络新闻, 地理数据,以及其它特定数据格式的应用。QT的网络模块可以以一种很简单的方式下载这样的数据,然后解析数据,把它转换成能被自己的代码处理的合适的格 式。也可以通过QtXmlPatterns模块处理,当输出格式是XML或者想在XHMTL网页中显示时,这样更加方便。

          我们通过一个小例子来大致了解一下这个有意思的部分。我们下载一个新闻源,用XSLT把它从XML转换成XHTML,然后通过QWebPage把它显示出 来。(图略)
          
    QNetworkAccessManager 类让你很容易处理客户端和WEB服务器之间的交互。它帮你处理诸如代理,保存设置,COOKIE以及SSL会话这些细节。总之,它不但让你在象上传下载这 些常见情况更加容易,还可以帮你处理登录,认证这些复杂会话。
       
    为了下载我们例子中的新闻源,我们所有要做的就是创建一个QNetworkAccessManager 然后调用它的get方法。结果通过 finished(QNetworkReply*) 信号返回。

    {

    QNetworkAccessManager *manager = new QNetworkAccessManager( this );
    connect( manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(handleReply(QNetworkReply*)) );
    connect( manager, SIGNAL(finished(QNetworkReply*)), m_progressBar, SLOT(hide()) );
    QNetworkReply *reply = manager->
    get( QNetworkRequest( QUrl( feedUrl ) ) );
    connect( reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(updateProgress(qint64,qint64)) );
    }



    未完。。。。

  • 相关阅读:
    SpringMVC中静态获取request对象 Spring中获取 HttpServletRequest对象【转载】
    springcloud 的loadbalancer 轮询算法切换方法 2021.4.3
    springboot项目启动增加图标
    rabbitmq 端口作用以及修改方法
    centos8 安装rabbitmq
    springcloud config client Value获取不到信息的问题的处理方法
    springcloud config配置git作为数据源然后启动报错 If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
    Sublime Text的列模式如何操作
    centos8 安装redis
    jQuery简单的Ajax调用
  • 原文地址:https://www.cnblogs.com/baizx/p/1810250.html
Copyright © 2011-2022 走看看