diff options
Diffstat (limited to 'examples/widgets/pdfviewer/sequentialpagewidget.cpp')
-rw-r--r-- | examples/widgets/pdfviewer/sequentialpagewidget.cpp | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/examples/widgets/pdfviewer/sequentialpagewidget.cpp b/examples/widgets/pdfviewer/sequentialpagewidget.cpp new file mode 100644 index 0000000..5de4f2e --- /dev/null +++ b/examples/widgets/pdfviewer/sequentialpagewidget.cpp @@ -0,0 +1,63 @@ +#include "sequentialpagewidget.h" +#include <QPaintEvent> +#include <QPainter> +#include <QPdfDocument> +#include <QGuiApplication> +#include <QScreen> +#include <QLoggingCategory> + +Q_DECLARE_LOGGING_CATEGORY(lcExample) + +SequentialPageWidget::SequentialPageWidget(QWidget *parent) + : QWidget(parent) + , m_doc(Q_NULLPTR) + , m_background(Qt::darkGray) + , m_pageSpacing(3) + , m_zoom(1.) + , m_top(0.) + , m_screenResolution(QGuiApplication::primaryScreen()->logicalDotsPerInch() / 72.0) +{ +} + +SequentialPageWidget::~SequentialPageWidget() +{ + +} + +void SequentialPageWidget::setDocument(QPdfDocument *doc) +{ + m_doc = doc; +} + +void SequentialPageWidget::setZoom(qreal factor) +{ + m_zoom = factor; + m_pageCache.clear(); + update(); +} + +void SequentialPageWidget::paintEvent(QPaintEvent * event) +{ + QPainter painter(this); + if (!m_doc) { + painter.drawText(rect(), Qt::AlignCenter, tr("no document loaded")); + return; + } + + painter.fillRect(event->rect(), m_background); + qCDebug(lcExample) << event->rect() << m_doc->pageCount(); + + int page = 0; // qFloor(m_top); + int y = 0; // TODO event->rect().top(); + while (y < event->rect().bottom() && page < m_doc->pageCount()) { + QSizeF size = m_doc->pageSize(page) * m_screenResolution * m_zoom; + if (!m_pageCache.contains(page)) { + qCDebug(lcExample) << "rendering page" << page << "to size" << size; + m_pageCache.insert(page, QPixmap::fromImage(m_doc->render(page, size))); + } + const QPixmap &pm = m_pageCache[page]; + painter.drawPixmap(0, y, pm); + y += pm.height() + m_pageSpacing; + ++page; + } +} |