summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorTobias Koenig <tobias.koenig@kdab.com>2016-08-24 13:34:54 +0200
committerMichal Klocek <michal.klocek@qt.io>2019-11-25 12:01:39 +0100
commitb9f3310cf9f5d2a35c1c97c334931052cee6f932 (patch)
tree8320ac72e7ce3b604f77a5de4182302873f51217 /examples
parent945840bd067d9ca3179a667f48b451cc2087931b (diff)
pdfviewer: Move QPdfDocument to MainWindow
Move the QPdfDocument out of PageRenderer into MainWindow, since the document is needed there to get more information. This patch ignores the locking for now, since QPdfDocument::render() seem to be a read-only action anyway. Change-Id: Idd322bcb87a296a70a04b60984378049e6c4e4fb Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'examples')
-rw-r--r--examples/widgets/pdfviewer/mainwindow.cpp14
-rw-r--r--examples/widgets/pdfviewer/mainwindow.h7
-rw-r--r--examples/widgets/pdfviewer/pagerenderer.cpp47
-rw-r--r--examples/widgets/pdfviewer/pagerenderer.h15
-rw-r--r--examples/widgets/pdfviewer/sequentialpagewidget.cpp25
-rw-r--r--examples/widgets/pdfviewer/sequentialpagewidget.h6
6 files changed, 68 insertions, 46 deletions
diff --git a/examples/widgets/pdfviewer/mainwindow.cpp b/examples/widgets/pdfviewer/mainwindow.cpp
index eacb68b92..901e80128 100644
--- a/examples/widgets/pdfviewer/mainwindow.cpp
+++ b/examples/widgets/pdfviewer/mainwindow.cpp
@@ -22,13 +22,14 @@
#include "mainwindow.h"
#include "ui_mainwindow.h"
+#include "sequentialpagewidget.h"
+
#include <QFileDialog>
#include <QLineEdit>
#include <QMessageBox>
-#include <QScroller>
#include <QPdfDocument>
+#include <QScroller>
#include <QtMath>
-#include "sequentialpagewidget.h"
const qreal zoomMultiplier = qSqrt(2.0);
@@ -40,6 +41,7 @@ MainWindow::MainWindow(QWidget *parent)
, m_pageWidget(new SequentialPageWidget(this))
, m_zoomEdit(new QLineEdit(this))
, m_pageEdit(new QLineEdit(this))
+ , m_document(new QPdfDocument(this))
{
ui->setupUi(this);
ui->scrollArea->setWidget(m_pageWidget);
@@ -57,6 +59,8 @@ MainWindow::MainWindow(QWidget *parent)
connect(m_pageEdit, SIGNAL(returnPressed()), this, SLOT(on_actionGo_triggered()));
QScroller::grabGesture(ui->scrollArea);
+
+ m_pageWidget->setDocument(m_document);
}
MainWindow::~MainWindow()
@@ -66,9 +70,9 @@ MainWindow::~MainWindow()
void MainWindow::open(const QUrl &docLocation)
{
- if (docLocation.isLocalFile())
- m_pageWidget->openDocument(docLocation);
- else {
+ if (docLocation.isLocalFile()) {
+ m_document->load(docLocation.toLocalFile());
+ } else {
qCDebug(lcExample) << docLocation << "is not a valid local file";
QMessageBox::critical(this, tr("Failed to open"), tr("%1 is not a valid local file").arg(docLocation.toString()));
}
diff --git a/examples/widgets/pdfviewer/mainwindow.h b/examples/widgets/pdfviewer/mainwindow.h
index d3db7a158..37996b6aa 100644
--- a/examples/widgets/pdfviewer/mainwindow.h
+++ b/examples/widgets/pdfviewer/mainwindow.h
@@ -22,8 +22,8 @@
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
-#include <QMainWindow>
#include <QLoggingCategory>
+#include <QMainWindow>
Q_DECLARE_LOGGING_CATEGORY(lcExample)
@@ -32,6 +32,7 @@ class MainWindow;
}
class QLineEdit;
+class QPdfDocument;
class SequentialPageWidget;
class MainWindow : public QMainWindow
@@ -39,7 +40,7 @@ class MainWindow : public QMainWindow
Q_OBJECT
public:
- explicit MainWindow(QWidget *parent = 0);
+ explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
public slots:
@@ -66,6 +67,8 @@ private:
SequentialPageWidget *m_pageWidget;
QLineEdit *m_zoomEdit;
QLineEdit *m_pageEdit;
+
+ QPdfDocument *m_document;
};
#endif // MAINWINDOW_H
diff --git a/examples/widgets/pdfviewer/pagerenderer.cpp b/examples/widgets/pdfviewer/pagerenderer.cpp
index 33f555334..7a9df635d 100644
--- a/examples/widgets/pdfviewer/pagerenderer.cpp
+++ b/examples/widgets/pdfviewer/pagerenderer.cpp
@@ -20,17 +20,18 @@
******************************************************************************/
#include "pagerenderer.h"
+
+#include <QElapsedTimer>
+#include <QLoggingCategory>
#include <QPainter>
#include <QPdfDocument>
-#include <QLoggingCategory>
-#include <QElapsedTimer>
#include <QUrl>
Q_DECLARE_LOGGING_CATEGORY(lcExample)
-PageRenderer::PageRenderer()
- : QThread(Q_NULLPTR)
- , m_doc(new QPdfDocument(this))
+PageRenderer::PageRenderer(QObject *parent)
+ : QThread(parent)
+ , m_document(nullptr)
, m_page(0)
, m_zoom(1.)
, m_minRenderTime(1000000000.)
@@ -40,23 +41,9 @@ PageRenderer::PageRenderer()
{
}
-PageRenderer::~PageRenderer()
-{
-}
-
-QVector<QSizeF> PageRenderer::openDocument(const QUrl &location)
+void PageRenderer::setDocument(QPdfDocument *document)
{
- if (location.isLocalFile())
- m_doc.load(location.toLocalFile());
- else {
- qCWarning(lcExample, "non-local file loading is not implemented");
- return QVector<QSizeF>();
- }
- // TODO maybe do in run() if it takes too long
- QVector<QSizeF> pageSizes;
- for (int page = 0; page < m_doc.pageCount(); ++page)
- pageSizes.append(m_doc.pageSize(page));
- return pageSizes;
+ m_document = document;
}
void PageRenderer::requestPage(int page, qreal zoom, Priority priority)
@@ -74,16 +61,26 @@ void PageRenderer::run()
void PageRenderer::renderPage(int page, qreal zoom)
{
- QSizeF size = m_doc.pageSize(page) * m_zoom;
- QElapsedTimer timer; timer.start();
- const QImage &img = m_doc.render(page, size);
- qreal secs = timer.nsecsElapsed() / 1000000000.0;
+ if (!m_document || m_document->status() != QPdfDocument::Ready)
+ return;
+
+ const QSizeF size = m_document->pageSize(page) * m_zoom;
+
+ QElapsedTimer timer;
+ timer.start();
+
+ const QImage &img = m_document->render(page, size);
+
+ const qreal secs = timer.nsecsElapsed() / 1000000000.0;
if (secs < m_minRenderTime)
m_minRenderTime = secs;
+
if (secs > m_maxRenderTime)
m_maxRenderTime = secs;
+
m_totalRenderTime += secs;
++m_totalPagesRendered;
+
emit pageReady(page, zoom, img);
qCDebug(lcExample) << "page" << page << "zoom" << m_zoom << "size" << size << "in" << secs <<
diff --git a/examples/widgets/pdfviewer/pagerenderer.h b/examples/widgets/pdfviewer/pagerenderer.h
index 94987c4c6..be861a974 100644
--- a/examples/widgets/pdfviewer/pagerenderer.h
+++ b/examples/widgets/pdfviewer/pagerenderer.h
@@ -22,24 +22,21 @@
#ifndef PAGECACHE_H
#define PAGECACHE_H
-#include <QBrush>
-#include <QHash>
-#include <QPixmap>
-#include <QRunnable>
+#include <QImage>
#include <QThread>
-#include <QPdfDocument>
class QPdfDocument;
class PageRenderer : public QThread
{
Q_OBJECT
+
public:
- PageRenderer();
- ~PageRenderer();
+ explicit PageRenderer(QObject *parent = nullptr);
public slots:
- QVector<QSizeF> openDocument(const QUrl &location);
+ void setDocument(QPdfDocument *document);
+
void requestPage(int page, qreal zoom, Priority priority = QThread::NormalPriority);
signals:
@@ -52,7 +49,7 @@ private:
void renderPage(int page, qreal zoom);
private:
- QPdfDocument m_doc;
+ QPdfDocument *m_document;
// current request only
int m_page;
diff --git a/examples/widgets/pdfviewer/sequentialpagewidget.cpp b/examples/widgets/pdfviewer/sequentialpagewidget.cpp
index f02290a0a..b0dcb1e19 100644
--- a/examples/widgets/pdfviewer/sequentialpagewidget.cpp
+++ b/examples/widgets/pdfviewer/sequentialpagewidget.cpp
@@ -42,6 +42,7 @@ SequentialPageWidget::SequentialPageWidget(QWidget *parent)
, m_topPageShowing(0)
, m_zoom(1.)
, m_screenResolution(QGuiApplication::primaryScreen()->logicalDotsPerInch() / 72.0)
+ , m_document(nullptr)
{
connect(m_pageRenderer, SIGNAL(pageReady(int, qreal, QImage)), this, SLOT(pageLoaded(int, qreal, QImage)), Qt::QueuedConnection);
grabGesture(Qt::SwipeGesture);
@@ -52,11 +53,14 @@ SequentialPageWidget::~SequentialPageWidget()
delete m_pageRenderer;
}
-void SequentialPageWidget::openDocument(const QUrl &url)
+void SequentialPageWidget::setDocument(QPdfDocument *document)
{
- m_pageSizes = m_pageRenderer->openDocument(url);
- m_topPageShowing = 0;
- invalidate();
+ m_pageRenderer->setDocument(document);
+
+ m_document = document;
+ connect(m_document, &QPdfDocument::statusChanged, this, &SequentialPageWidget::documentStatusChanged);
+
+ documentStatusChanged();
}
void SequentialPageWidget::setZoom(qreal factor)
@@ -90,6 +94,19 @@ void SequentialPageWidget::invalidate()
update();
}
+void SequentialPageWidget::documentStatusChanged()
+{
+ m_pageSizes.clear();
+ m_topPageShowing = 0;
+
+ if (m_document->status() == QPdfDocument::Ready) {
+ for (int page = 0; page < m_document->pageCount(); ++page)
+ m_pageSizes.append(m_document->pageSize(page));
+ }
+
+ invalidate();
+}
+
void SequentialPageWidget::pageLoaded(int page, qreal zoom, QImage image)
{
Q_UNUSED(zoom)
diff --git a/examples/widgets/pdfviewer/sequentialpagewidget.h b/examples/widgets/pdfviewer/sequentialpagewidget.h
index 233e5dbee..ca45fe4c1 100644
--- a/examples/widgets/pdfviewer/sequentialpagewidget.h
+++ b/examples/widgets/pdfviewer/sequentialpagewidget.h
@@ -40,8 +40,9 @@ public:
int topPageShowing() { return m_topPageShowing; }
int bottomPageShowing() { return m_bottomPageShowing; }
+ void setDocument(QPdfDocument *document);
+
public slots:
- void openDocument(const QUrl &url);
void setZoom(qreal factor);
void invalidate();
@@ -50,6 +51,7 @@ signals:
void zoomChanged(qreal factor);
private slots:
+ void documentStatusChanged();
void pageLoaded(int page, qreal zoom, QImage image);
private:
@@ -72,6 +74,8 @@ private:
QSize m_totalSize;
qreal m_zoom;
qreal m_screenResolution; // pixels per point
+
+ QPdfDocument *m_document;
};
#endif // SEQUENTIALPAGEWIDGET_H