diff options
author | No'am Rosenthal <noam.rosenthal@nokia.com> | 2009-11-28 16:16:12 -0800 |
---|---|---|
committer | No'am Rosenthal <noam.rosenthal@nokia.com> | 2009-11-28 16:16:12 -0800 |
commit | 1eec369503511779f6204ccff1cbd7010f60e65c (patch) | |
tree | fbf27ef76aab993b455c7b6554a16594d465c8c3 /deconstructive/main.cpp | |
parent | f056bf3efa4dbfc4e43394c6c1b3951193b98401 (diff) |
Added the Deconstructive HTML dojo
Diffstat (limited to 'deconstructive/main.cpp')
-rw-r--r-- | deconstructive/main.cpp | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/deconstructive/main.cpp b/deconstructive/main.cpp new file mode 100644 index 0000000..46ed597 --- /dev/null +++ b/deconstructive/main.cpp @@ -0,0 +1,122 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the Graphics Dojo project on Qt Labs. +** +** This file may be used under the terms of the GNU General Public +** License version 2.0 or 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of +** this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** http://www.fsf.org/licensing/licenses/info/GPLv2.html and +** http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#include <QtGui/QApplication> +#include <QWebView> +#include <QWebElement> +#include <QWebPage> +#include <QWebFrame> +#include <QNetworkReply> +#include <QNetworkAccessManager> +#include <QTimer> +#include <QBuffer> +#include <QDebug> +#include <QFile> + +namespace { + class RendererNetworkReply : public QNetworkReply + { + Q_OBJECT + QBuffer buffer; + public: + RendererNetworkReply(QWebFrame* frame,const QNetworkRequest & r) + : QNetworkReply(frame) + { + setRequest(r); + QString selector = r.url().toString(QUrl::RemoveScheme|QUrl::RemoveQuery); + selector = QUrl::fromPercentEncoding(selector.toAscii()); + setOperation(QNetworkAccessManager::GetOperation); + setHeader(QNetworkRequest::ContentTypeHeader,QVariant("image/png")); + open(ReadOnly|Unbuffered); + setUrl(r.url()); + QWebElement element = frame->findFirstElement(selector); + QPixmap pxm(element.geometry().size()); + pxm.fill(Qt::transparent); + { + QPainter painter(&pxm); + element.render(&painter); + } + buffer.open(QIODevice::WriteOnly); + pxm.save(&buffer,"png"); + buffer.close(); + buffer.open(QIODevice::ReadOnly); + QTimer::singleShot(0,this,SIGNAL(readyRead())); + QTimer::singleShot(0,this,SIGNAL(finished())); + } + + virtual qint64 readData(char* data, qint64 maxSize) + { + return buffer.read(data,maxSize); + } + + virtual qint64 bytesAvailable() const + { + return buffer.bytesAvailable(); + } + + void setData(const QByteArray & data) + { + buffer.setData(data); + buffer.open(QIODevice::ReadOnly); + } + + + void abort() + { + } + }; + + class RendererNetworkAccessManager : public QNetworkAccessManager + { + QWebPage* webPage; + public: + RendererNetworkAccessManager(QWebPage* page) : QNetworkAccessManager(page),webPage(page) + { + } + QNetworkReply* createRequest(Operation op, const QNetworkRequest & req, QIODevice* outgoingData) + { + if (req.url().scheme() == "render" && op == GetOperation) { + return new RendererNetworkReply(webPage->currentFrame(),req); + } else + return QNetworkAccessManager::createRequest(op,req,outgoingData); + } + }; + +}; + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + QWebSettings::globalSettings()->setAttribute(QWebSettings::DeveloperExtrasEnabled,true); + QWebView w; + w.page()->setNetworkAccessManager(new RendererNetworkAccessManager(w.page())); + QFile f("example.html"); + f.open(QIODevice::ReadOnly); + w.setHtml(f.readAll()); + f.close(); + w.show(); + return a.exec(); +} + + +#include <main.moc> |