diff options
author | Joerg Bornemann <joerg.bornemann@theqtcompany.com> | 2015-11-16 13:32:06 +0100 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@theqtcompany.com> | 2015-11-16 16:08:23 +0000 |
commit | eb8eb72ec7e589eedd79143dc7c3fb241706f405 (patch) | |
tree | d7f37743c27355ee1a6c19ea7cb83e13227b8c4a /examples/webenginewidgets/contentmanipulation/mainwindow.cpp | |
parent | 2abe1f1b5a317339105a37d6f0ff8450b945d338 (diff) |
rename fancybrowser to contentmanipulation
The name "fancybrowser" tricks people into thinking that this is the
reference browser example. But this example is a very simple browser
with an additional fancy content manipulation feature.
Rename this example to contentmanipulation to reflect reality.
Change-Id: I200b701acdc4de1210b550b9f054753e5f1d1ea4
Reviewed-by: Michael BrĂ¼ning <michael.bruning@theqtcompany.com>
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@theqtcompany.com>
Reviewed-by: Kai Koehne <kai.koehne@theqtcompany.com>
Diffstat (limited to 'examples/webenginewidgets/contentmanipulation/mainwindow.cpp')
-rw-r--r-- | examples/webenginewidgets/contentmanipulation/mainwindow.cpp | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/examples/webenginewidgets/contentmanipulation/mainwindow.cpp b/examples/webenginewidgets/contentmanipulation/mainwindow.cpp new file mode 100644 index 000000000..3dca497a3 --- /dev/null +++ b/examples/webenginewidgets/contentmanipulation/mainwindow.cpp @@ -0,0 +1,225 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** 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 The Qt Company Ltd 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 <QtWebEngineWidgets> +#include "mainwindow.h" + +template<typename Arg, typename R, typename C> +struct InvokeWrapper { + R *receiver; + void (C::*memberFun)(Arg); + void operator()(Arg result) { + (receiver->*memberFun)(result); + } +}; + +template<typename Arg, typename R, typename C> +InvokeWrapper<Arg, R, C> invoke(R *receiver, void (C::*memberFun)(Arg)) +{ + InvokeWrapper<Arg, R, C> wrapper = {receiver, memberFun}; + return wrapper; +} + +//! [1] + +MainWindow::MainWindow(const QUrl& url) +{ + progress = 0; + + QFile file; + file.setFileName(":/jquery.min.js"); + file.open(QIODevice::ReadOnly); + jQuery = file.readAll(); + jQuery.append("\nvar qt = { 'jQuery': jQuery.noConflict(true) };"); + file.close(); +//! [1] + +//! [2] + view = new QWebEngineView(this); + view->load(url); + connect(view, SIGNAL(loadFinished(bool)), SLOT(adjustLocation())); + connect(view, SIGNAL(titleChanged(QString)), SLOT(adjustTitle())); + connect(view, SIGNAL(loadProgress(int)), SLOT(setProgress(int))); + connect(view, SIGNAL(loadFinished(bool)), SLOT(finishLoading(bool))); + + locationEdit = new QLineEdit(this); + locationEdit->setSizePolicy(QSizePolicy::Expanding, locationEdit->sizePolicy().verticalPolicy()); + connect(locationEdit, SIGNAL(returnPressed()), SLOT(changeLocation())); + + QToolBar *toolBar = addToolBar(tr("Navigation")); + toolBar->addAction(view->pageAction(QWebEnginePage::Back)); + toolBar->addAction(view->pageAction(QWebEnginePage::Forward)); + toolBar->addAction(view->pageAction(QWebEnginePage::Reload)); + toolBar->addAction(view->pageAction(QWebEnginePage::Stop)); + toolBar->addWidget(locationEdit); +//! [2] + + QMenu *viewMenu = menuBar()->addMenu(tr("&View")); + QAction* viewSourceAction = new QAction("Page Source", this); + connect(viewSourceAction, SIGNAL(triggered()), SLOT(viewSource())); + viewMenu->addAction(viewSourceAction); + +//! [3] + QMenu *effectMenu = menuBar()->addMenu(tr("&Effect")); + effectMenu->addAction("Highlight all links", this, SLOT(highlightAllLinks())); + + rotateAction = new QAction(this); + rotateAction->setIcon(style()->standardIcon(QStyle::SP_FileDialogDetailedView)); + rotateAction->setCheckable(true); + rotateAction->setText(tr("Turn images upside down")); + connect(rotateAction, SIGNAL(toggled(bool)), this, SLOT(rotateImages(bool))); + effectMenu->addAction(rotateAction); + + QMenu *toolsMenu = menuBar()->addMenu(tr("&Tools")); + toolsMenu->addAction(tr("Remove GIF images"), this, SLOT(removeGifImages())); + toolsMenu->addAction(tr("Remove all inline frames"), this, SLOT(removeInlineFrames())); + toolsMenu->addAction(tr("Remove all object elements"), this, SLOT(removeObjectElements())); + toolsMenu->addAction(tr("Remove all embedded elements"), this, SLOT(removeEmbeddedElements())); + + setCentralWidget(view); +} +//! [3] + +void MainWindow::viewSource() +{ + QTextEdit* textEdit = new QTextEdit(NULL); + textEdit->setAttribute(Qt::WA_DeleteOnClose); + textEdit->adjustSize(); + textEdit->move(this->geometry().center() - textEdit->rect().center()); + textEdit->show(); + + view->page()->toHtml(invoke(textEdit, &QTextEdit::setPlainText)); +} + +//! [4] +void MainWindow::adjustLocation() +{ + locationEdit->setText(view->url().toString()); +} + +void MainWindow::changeLocation() +{ + QUrl url = QUrl::fromUserInput(locationEdit->text()); + view->load(url); + view->setFocus(); +} +//! [4] + +//! [5] +void MainWindow::adjustTitle() +{ + if (progress <= 0 || progress >= 100) + setWindowTitle(view->title()); + else + setWindowTitle(QString("%1 (%2%)").arg(view->title()).arg(progress)); +} + +void MainWindow::setProgress(int p) +{ + progress = p; + adjustTitle(); +} +//! [5] + +//! [6] +void MainWindow::finishLoading(bool) +{ + progress = 100; + adjustTitle(); + view->page()->runJavaScript(jQuery); + + rotateImages(rotateAction->isChecked()); +} +//! [6] + +//! [7] +void MainWindow::highlightAllLinks() +{ + // We append '; undefined' after the jQuery call here to prevent a possible recursion loop and crash caused by + // the way the elements returned by the each iterator elements reference each other, which causes problems upon + // converting them to QVariants. + QString code = "qt.jQuery('a').each( function () { qt.jQuery(this).css('background-color', 'yellow') } ); undefined"; + view->page()->runJavaScript(code); +} +//! [7] + +//! [8] +void MainWindow::rotateImages(bool invert) +{ + QString code; + + // We append '; undefined' after each of the jQuery calls here to prevent a possible recursion loop and crash caused by + // the way the elements returned by the each iterator elements reference each other, which causes problems upon + // converting them to QVariants. + if (invert) + code = "qt.jQuery('img').each( function () { qt.jQuery(this).css('-webkit-transition', '-webkit-transform 2s'); qt.jQuery(this).css('-webkit-transform', 'rotate(180deg)') } ); undefined"; + else + code = "qt.jQuery('img').each( function () { qt.jQuery(this).css('-webkit-transition', '-webkit-transform 2s'); qt.jQuery(this).css('-webkit-transform', 'rotate(0deg)') } ); undefined"; + view->page()->runJavaScript(code); +} +//! [8] + +//! [9] +void MainWindow::removeGifImages() +{ + QString code = "qt.jQuery('[src*=gif]').remove()"; + view->page()->runJavaScript(code); +} + +void MainWindow::removeInlineFrames() +{ + QString code = "qt.jQuery('iframe').remove()"; + view->page()->runJavaScript(code); +} + +void MainWindow::removeObjectElements() +{ + QString code = "qt.jQuery('object').remove()"; + view->page()->runJavaScript(code); +} + +void MainWindow::removeEmbeddedElements() +{ + QString code = "qt.jQuery('embed').remove()"; + view->page()->runJavaScript(code); +} +//! [9] + |