zoukankan      html  css  js  c++  java
  • CS001496 Gather data from web page with JavaScript, WebKit, and Qt

    CS001496 - Gather data from web page with JavaScript, WebKit, and Qt - Nokia Developer Wiki

    CS001496 - Gather data from web page with JavaScript, WebKit, and Qt


    Jump to: navigation,
    search



    Overview

    This snippet demonstrates how you can gather data from a web page to Qt via WebKit. We will use the CS001495 - Display local web page with Qt WebKit article as base for this snippet.

    Preconditions

    Code

    html/view.html

    We'll add two JavaScript includes in the head tag.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
      <head>
        <!-- You reference the resources with qrc:// -->
        <!-- Stylesheet reference -->
        <link rel="stylesheet" href="qrc:///css/view.css" />
        <!-- jQuery include -->
        <script type="text/javascript" src="qrc:///js/jquery.js" />
        <!-- Our own script include -->
        <script type="text/javascript" src="qrc:///js/script.js" />
     
        <title>WebKit example</title>
      </head>
      <body>
        <!-- Header -->
        <h1 id="header">Welcome</h1>
        <!-- Paragraph -->
        <p id="paragraph">Hello World!</p>
        <!-- Form -->
        <form id="form" action="#">
          <fieldset>
            <label for="text">Text</label>
            <!-- Text input -->
            <input id="text" type="text" />
            <!-- Submit button -->
            <input id="button" type="button" value="Submit!"/>
          </fieldset>
        </form>
      </body>
    </html>

    js/jquery.js

    This js file is a reference to a JavaScript library called jQuery. You can obtain it here: http://docs.jquery.com/Downloading_jQuery#Download_jQuery

    jQuery enables you to be more productive when writing JavaScript.

    js/script.js

    This file includes JavaScript which is used to create animations and dynamically add content to the site from the web page.

    /**
      * Adds p element after the element which has paragraph as the id
      * with the content from input element with text as the id.
      * This is jQuery syntax: http://www.jquery.com
      *
      * $("#paragraph") documented here: http://docs.jquery.com/Selectors/id#id
      * .after documented here: http://docs.jquery.com/Manipulation/after
      * .val documented here: http://docs.jquery.com/Val
      */
    button_click = function(event) {
        $("#paragraph").after("<p>" + $("#text").val() + "</p>");
    }
     
    /**
      * This is run after the the web page has been rendered.
      * $(document).ready documented here:
      * http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
      */
    $(document).ready(function(){
        /*
         * Hides all the h1 elements.
         * Element selector: http://docs.jquery.com/Selectors/element#element
         * hide function: http://docs.jquery.com/Hide
         */
        $("h1").hide();
        /*
         * Hides all the p elements.
         */
        $("p").hide();
        /*
         * Hides element with form id.
         */
        $("#form").hide();
        /*
         * Shows all the h1 elements with animation.
         * show function: http://docs.jquery.com/Show
         */
        $("h1").show('slow');
        /*
         * Shows all the p elements with animation.
         */
        $("p").show('slow');
        /*
         * Shows the element with form as id with animation.
         */
        $("#form").show('slow');
        /*
         * Adds button_click as click event handler
         * for element with button as id.
         * click function: http://docs.jquery.com/Events/click
         */
        $("#button").click(button_click);
    });

    src/gather-data.js

    /**
      * Gathers all the text content from p elements
      * to an array and returns it.
      */
    Qt_QWET_gather = function() {
      a = [];
      e = document.getElementsByTagName('p');
      for(var i = 0; i < e.length; i++) {
        a.push(e[i].textContent);
      }
      return a;
    };
    Qt_QWET_gather();

    Add these files to the resources file and include the resource file in your project file as explained in CS001503 - Using resources in Qt.

    The following code demonstrates how to read data from the web page via JavaScript executed from Qt.

    src/qwet.h

    The only things added to the header file in comparison to CS001495 - Display local web page with Qt WebKit are includes, the gatherButtonClicked slot, helper methods, and a reference to QListWidget which is used to display the gathered data.

    #ifndef QWET_H
    #define QWET_H
     
    #include <QtCore/QPointer>
    #include <QtCore/QFile>
    #include <QtCore/QTextStream>
    #include <QtCore/QVariant>
    #include <QtCore/QList>
     
    #include <QtWebKit/QWebView>
    #include <QtWebKit/QWebPage>
    #include <QtWebKit/QWebFrame>
     
    #include <QtGui/QWidget>
    #include <QtGui/QMainWindow>
    #include <QtGui/QFrame>
    #include <QtGui/QVBoxLayout>
    #include <QtGui/QListWidget>
    #include <QtGui/QPushButton>
     
    class QWET : public QMainWindow
    {
        Q_OBJECT
     
    public:
        QWET(QWidget *parent = 0);
        ~QWET();
     
    private slots:
        void gatherButtonClicked();
    private:
        QPointer<QWebView> _webView;
        QPointer<QVBoxLayout> _layout;
        QPointer<QListWidget> _pList;
     
        QString _gatherJS;
     
        void setupUI();
     
        QString readFileToQString(const QString& fileName) const;
        void updatePList(QListWidget* widget,
                         const QList<QVariant>& values);
    };
     
    #endif // QWET_H

    src/qwet.cpp

    #include "qwet.h"
     
    QWET::QWET(QWidget *parent) : QMainWindow(parent) 
    {
        setupUI();
    }
     
    QWET::~QWET() 
    {
    }
     
    void QWET::setupUI() 
    {
        /**
          * Create the central widget
          * and set it.
          */
        QFrame* cW = new QFrame(this);
        setCentralWidget(cW);
     
        /**
          * Set the layout to central widget.
          */
        _layout = new QVBoxLayout(this);
        cW->setLayout(_layout);
        _layout->setMargin(0);
        _layout->setSpacing(0);
     
        /**
          * Let's create the web view which
          * will be used to display our page
          * with which we will be communicating with.
          */
        _webView = new QWebView(this);
        _webView->load(QUrl("qrc:///html/view.html"));
        _webView->show();
     
        /** Add it to layout */
        _layout->addWidget(_webView);
     
        /** We'll gather the results to list widget.  */
        _pList = new QListWidget(this);
        _layout->addWidget(_pList);
     
        /** Add the gather text button */
        QPushButton* gatherButton = new QPushButton("Gather text.", this);
        connect(gatherButton, SIGNAL(clicked()),
                this, SLOT(gatherButtonClicked()));
     
        _layout->addWidget(gatherButton);
    }
     
    /**
      * This slot gathers the p text content from the html page
      * and adds it to the the list widget.
      */
    void QWET::gatherButtonClicked() 
    {
        /**
          * Read the java script to be executed to a string.
          */
        if(this->_gatherJS.isEmpty()) {
            this->_gatherJS = this->readFileToQString(QString(":/js/gather-data.js"));
        }
        else {
            this->_gatherJS = "Qt_QWET_gather();";
        }
        /** Run the java script on the page and get results. */
        QVariant variant = this->_webView->page()->mainFrame()->evaluateJavaScript(this->_gatherJS);
        /** We make sure that the results are there. */
        if(!variant.isNull() &&
           variant.type() == QVariant::List) {
            /** Ask for the acual list we're expecting. */
            QList<QVariant> list = variant.toList();
            /** Update the entries in the list widget.*/
            this->updatePList(this->_pList.data(), list);
        }
    }
     
    /**
      * This function updates list widgets entries
      */
    void QWET::updatePList(QListWidget* widget, const QList<QVariant>& values) 
    {
        /** Check that the parameters are valid. */
        if(widget != 0 &&
           !values.isEmpty()) {
            /** Clear the entries. */
            widget->clear();
            /** Go through the values...*/
            QListIterator<QVariant> i(values);
            while(i.hasNext()) {
                QVariant v = i.next();
                /** ...and add them to widget. */
                widget->addItem(v.toString());
            }
        }
    }
     
    /**
      * Reads file to a string.
      */
    QString QWET::readFileToQString(const QString& fileName) const 
    {
        QFile file(fileName);
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
            return QString();
     
        QTextStream in(&file);
        QString content = in.readAll();
        file.close();
        return content;
    }

    Postconditions

    You've now created this:

    QWETGD N900.pngQWETGD N97.png

    See also

  • 相关阅读:
    【PAT甲级】1043 Is It a Binary Search Tree (25 分)(判断是否为BST的先序遍历并输出后序遍历)
    Educational Codeforces Round 73 (Rated for Div. 2)F(线段树,扫描线)
    【PAT甲级】1042 Shuffling Machine (20 分)
    【PAT甲级】1041 Be Unique (20 分)(多重集)
    【PAT甲级】1040 Longest Symmetric String (25 分)(cin.getline(s,1007))
    【PAT甲级】1039 Course List for Student (25 分)(vector嵌套于map,段错误原因未知)
    Codeforces Round #588 (Div. 2)E(DFS,思维,__gcd,树)
    2017-3-9 SQL server 数据库
    2017-3-8 学生信息展示习题
    2017-3-5 C#基础 函数--递归
  • 原文地址:https://www.cnblogs.com/lexus/p/2441977.html
Copyright © 2011-2022 走看看