framecapture.cpp Example File | Qt WebKit Examples 5.9

Qt 5.9 | Qt WebKit Examples | WebKit Frame Capture Example | framecapture.cpp Example File

Qt 5.9.2 Reference Documentation

# framecapture.cpp Example File

webkitwidgets/framecapture/framecapture.cpp

      /****************************************************************************
      **
      ** 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 "framecapture.h"

      #include <iostream>

      FrameCapture::FrameCapture(): QObject(), m_percent(0)
      {
          connect(&m_page, SIGNAL(loadProgress(int)), this, SLOT(printProgress(int)));
          connect(&m_page, SIGNAL(loadFinished(bool)), this, SLOT(saveResult(bool)));
      }

      void FrameCapture::load(const QUrl &url, const QString &outputFileName)
      {
          std::cout << "Loading " << qPrintable(url.toString()) << std::endl;
          m_percent = 0;
          int index = outputFileName.lastIndexOf('.');
          m_fileName = (index == -1) ? outputFileName + ".png" : outputFileName;
          m_page.mainFrame()->load(url);
          m_page.mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff);
          m_page.mainFrame()->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff);
          m_page.setViewportSize(QSize(1024, 768));
      }

      void FrameCapture::printProgress(int percent)
      {
          if (m_percent >= percent)
              return;

          while (m_percent++ < percent)
              std::cout << "#" << std::flush;
      }

      void FrameCapture::saveResult(bool ok)
      {
          std::cout << std::endl;

          // crude error-checking
          if (!ok) {
              std::cerr << "Failed loading " << qPrintable(m_page.mainFrame()->url().toString()) << std::endl;
              emit finished();
              return;
          }

          // save each frame in different image files
          saveFrame(m_page.mainFrame());

          emit finished();
      }

      void FrameCapture::saveFrame(QWebFrame *frame)
      {
          static int frameCounter = 0;

          QString fileName(m_fileName);
          if (frameCounter) {
              int index = m_fileName.lastIndexOf('.');
              fileName = fileName.insert(index, "_frame" + QString::number(frameCounter));
          }

          QImage image(frame->contentsSize(), QImage::Format_ARGB32_Premultiplied);
          image.fill(Qt::transparent);

          QPainter painter(&image);
          painter.setRenderHint(QPainter::Antialiasing, true);
          painter.setRenderHint(QPainter::TextAntialiasing, true);
          painter.setRenderHint(QPainter::SmoothPixmapTransform, true);
          frame->documentElement().render(&painter);
          painter.end();

          image.save(fileName);

          ++frameCounter;
          foreach(QWebFrame *childFrame, frame->childFrames())
              saveFrame(childFrame);
      }