QT源码阅读——QT与HTML交互编程

来源:互联网 发布:原生js特效懒人之家 编辑:程序博客网 时间:2024/06/11 13:34

QT中通过QWebKit组件处理HTML,其中最重要的就是QWebView了~~~

通过例子formextractor我们可以窥之一二:

/******************************************************************************** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).** Contact: http://www.qt-project.org/legal**** This file is part of the examples of the Qt Toolkit.**** $QT_BEGIN_LICENSE:BSD$** You may use this file under the terms of the BSD license as follows:**** "Redistribution and use in source and binary forms, with or without** modification, are permitted provided that the following conditions are** met:**   * Redistributions of source code must retain the above copyright**     notice, this list of conditions and the following disclaimer.**   * Redistributions in binary form must reproduce the above copyright**     notice, this list of conditions and the following disclaimer in**     the documentation and/or other materials provided with the**     distribution.**   * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names**     of its contributors may be used to endorse or promote products derived**     from this software without specific prior written permission.****** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."**** $QT_END_LICENSE$******************************************************************************/#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include "formextractor.h"QT_BEGIN_NAMESPACEclass QAction;class QMenu;QT_END_NAMESPACEclass MainWindow : public QMainWindow{    Q_OBJECTpublic:    MainWindow();private slots:    void about();private:    FormExtractor *centralWidget;    QMenu *fileMenu;    QMenu *helpMenu;    QAction *exitAct;    QAction *aboutAct;    QAction *aboutQtAct;    void createActions();    void createMenus();};#endif // MAINWINDOW_H
/******************************************************************************** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).** Contact: http://www.qt-project.org/legal**** This file is part of the examples of the Qt Toolkit.**** $QT_BEGIN_LICENSE:BSD$** You may use this file under the terms of the BSD license as follows:**** "Redistribution and use in source and binary forms, with or without** modification, are permitted provided that the following conditions are** met:**   * Redistributions of source code must retain the above copyright**     notice, this list of conditions and the following disclaimer.**   * Redistributions in binary form must reproduce the above copyright**     notice, this list of conditions and the following disclaimer in**     the documentation and/or other materials provided with the**     distribution.**   * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names**     of its contributors may be used to endorse or promote products derived**     from this software without specific prior written permission.****** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."**** $QT_END_LICENSE$******************************************************************************/#include <QtWidgets>#include "mainwindow.h"MainWindow::MainWindow(){    createActions();    createMenus();    centralWidget = new FormExtractor(this);    setCentralWidget(centralWidget);    setUnifiedTitleAndToolBarOnMac(true);}void MainWindow::createActions(){    exitAct = new QAction(tr("E&xit"), this);    exitAct->setStatusTip(tr("Exit the application"));    exitAct->setShortcuts(QKeySequence::Quit);    connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));    aboutAct = new QAction(tr("&About"), this);    aboutAct->setStatusTip(tr("Show the application's About box"));    connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));    aboutQtAct = new QAction(tr("About &Qt"), this);    aboutQtAct->setStatusTip(tr("Show the Qt library's About box"));    connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt()));}void MainWindow::createMenus(){    fileMenu = menuBar()->addMenu(tr("&File"));    fileMenu->addAction(exitAct);    menuBar()->addSeparator();    helpMenu = menuBar()->addMenu(tr("&Help"));    helpMenu->addAction(aboutAct);    helpMenu->addAction(aboutQtAct);}void MainWindow::about(){    QMessageBox::about(this, tr("About Form Extractor"),        tr("The <b>Form Extractor</b> example demonstrates how to "           "extract data from a web form using QtWebKit."));}


核心交互类:

/******************************************************************************** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).** Contact: http://www.qt-project.org/legal**** This file is part of the examples of the Qt Toolkit.**** $QT_BEGIN_LICENSE:BSD$** You may use this file under the terms of the BSD license as follows:**** "Redistribution and use in source and binary forms, with or without** modification, are permitted provided that the following conditions are** met:**   * Redistributions of source code must retain the above copyright**     notice, this list of conditions and the following disclaimer.**   * Redistributions in binary form must reproduce the above copyright**     notice, this list of conditions and the following disclaimer in**     the documentation and/or other materials provided with the**     distribution.**   * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names**     of its contributors may be used to endorse or promote products derived**     from this software without specific prior written permission.****** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."**** $QT_END_LICENSE$******************************************************************************/#ifndef FORMEXTRACTOR_H#define FORMEXTRACTOR_H#include <QtWidgets/QWidget>#include <QWebFrame>#include "ui_formextractor.h"class FormExtractor : public QWidget{    Q_OBJECTpublic:    FormExtractor(QWidget *parent = 0, Qt::WindowFlags flags = 0);    ~FormExtractor();public slots:    void submit();    void populateJavaScriptWindowObject();private:    Ui::Form ui;};#endif // FORMEXTRACTOR_H
/******************************************************************************** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).** Contact: http://www.qt-project.org/legal**** This file is part of the examples of the Qt Toolkit.**** $QT_BEGIN_LICENSE:BSD$** You may use this file under the terms of the BSD license as follows:**** "Redistribution and use in source and binary forms, with or without** modification, are permitted provided that the following conditions are** met:**   * Redistributions of source code must retain the above copyright**     notice, this list of conditions and the following disclaimer.**   * Redistributions in binary form must reproduce the above copyright**     notice, this list of conditions and the following disclaimer in**     the documentation and/or other materials provided with the**     distribution.**   * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names**     of its contributors may be used to endorse or promote products derived**     from this software without specific prior written permission.****** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."**** $QT_END_LICENSE$******************************************************************************/#include "formextractor.h"#include <QWebElement>FormExtractor::FormExtractor(QWidget *parent, Qt::WindowFlags flags)    : QWidget(parent, flags){    ui.setupUi(this);    ui.webView->setUrl(QUrl("qrc:/form.html"));    connect(ui.webView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()),            this, SLOT(populateJavaScriptWindowObject()));    resize(300, 300);}FormExtractor::~FormExtractor(){}void FormExtractor::submit(){    QWebFrame *frame = ui.webView->page()->mainFrame();    QWebElement firstName = frame->findFirstElement("#firstname");    QWebElement lastName = frame->findFirstElement("#lastname");    QWebElement maleGender = frame->findFirstElement("#genderMale");    QWebElement femaleGender = frame->findFirstElement("#genderFemale");    QWebElement updates = frame->findFirstElement("#updates");    ui.firstNameEdit->setText(firstName.evaluateJavaScript("this.value").toString());    ui.lastNameEdit->setText(lastName.evaluateJavaScript("this.value").toString());    if (maleGender.evaluateJavaScript("this.checked").toBool())        ui.genderEdit->setText(maleGender.evaluateJavaScript("this.value").toString());    else if (femaleGender.evaluateJavaScript("this.checked").toBool())        ui.genderEdit->setText(femaleGender.evaluateJavaScript("this.value").toString());    if (updates.evaluateJavaScript("this.checked").toBool())        ui.updatesEdit->setText("Yes");    else        ui.updatesEdit->setText("No");}void FormExtractor::populateJavaScriptWindowObject(){    ui.webView->page()->mainFrame()->addToJavaScriptWindowObject("formExtractor", this);}


HTML页面:

<html><body><h1>The Green People Book Club</h1><p>Welcome to The Green People Book Club. Please register to obtain a membership with us.</p>    <form onsubmit="formExtractor.submit()">    <table>    <tbody><tr>        <td>        First name:        </td>        <td>            <input type="text" id="firstname">        </td>    </tr>    <tr>        <td>        Last name:        </td>        <td>            <input type="text" id="lastname">        </td>    </tr>    <tr>        <td>        Gender:        </td>        <td>        <input type="radio" name="gender" id="genderMale" value="Male"> Male        <input type="radio" name="gender" id="genderFemale" value="Female"> Female        </td>    </tr>    <tr>        <td colspan="2">        <input type="checkbox" id="updates" value="receive">        Check here if you would like to receive regular updates from us:        </td>    </tr>    </tbody></table>    <input type="submit" value="Submit">    </form></body></html>
其中关键就是:

<form onsubmit="formExtractor.submit()">

ui.webView->page()->mainFrame()->addToJavaScriptWindowObject("formExtractor", this);

void QWebFrame::addToJavaScriptWindowObject(const QString & name, QObject * object, ValueOwnership own = QtOwnership);

作用就是讲处理对象object作为html的window对象的javascript子对象,这样就相当于在html页面中添加了相应的javascript处理函数,实现了交互功能!


0 0
原创粉丝点击