summaryrefslogtreecommitdiffstats
path: root/examples/pdf
diff options
context:
space:
mode:
Diffstat (limited to 'examples/pdf')
-rw-r--r--examples/pdf/CMakeLists.txt5
-rw-r--r--examples/pdf/multipage/CMakeLists.txt16
-rw-r--r--examples/pdf/multipage/doc/src/multipage.qdoc4
-rw-r--r--examples/pdf/multipage/main.cpp16
-rw-r--r--examples/pdf/multipage/multipage.pro4
-rw-r--r--examples/pdf/multipage/pdfapplication.cpp16
-rw-r--r--examples/pdf/multipage/pdfapplication.h24
-rw-r--r--examples/pdf/multipage/resources/macos/Info.plist29
-rw-r--r--examples/pdf/multipage/resources/multipage.icnsbin0 -> 117648 bytes
-rw-r--r--examples/pdf/multipage/viewer.qml54
-rw-r--r--examples/pdf/multipage/viewer.qrc2
-rw-r--r--examples/pdf/pdf.pro2
-rw-r--r--examples/pdf/pdfviewer/main.cpp24
-rw-r--r--examples/pdf/singlepage/CMakeLists.txt (renamed from examples/pdf/pdfviewer/CMakeLists.txt)9
-rw-r--r--examples/pdf/singlepage/doc/src/singlepage.qdoc62
-rw-r--r--examples/pdf/singlepage/main.cpp37
-rw-r--r--examples/pdf/singlepage/resources/document-open.svg (renamed from examples/pdf/pdfviewer/resources/document-open.svg)0
-rw-r--r--examples/pdf/singlepage/resources/edit-clear.svg (renamed from examples/pdf/pdfviewer/resources/edit-clear.svg)0
-rw-r--r--examples/pdf/singlepage/resources/edit-copy.svg (renamed from examples/pdf/pdfviewer/resources/edit-copy.svg)0
-rw-r--r--examples/pdf/singlepage/resources/edit-select-all.svg (renamed from examples/pdf/pdfviewer/resources/edit-select-all.svg)0
-rw-r--r--examples/pdf/singlepage/resources/go-down-search.svg (renamed from examples/pdf/pdfviewer/resources/go-down-search.svg)0
-rw-r--r--examples/pdf/singlepage/resources/go-next-view-page.svg (renamed from examples/pdf/pdfviewer/resources/go-next-view-page.svg)0
-rw-r--r--examples/pdf/singlepage/resources/go-previous-view-page.svg (renamed from examples/pdf/pdfviewer/resources/go-previous-view-page.svg)0
-rw-r--r--examples/pdf/singlepage/resources/go-up-search.svg (renamed from examples/pdf/pdfviewer/resources/go-up-search.svg)0
-rw-r--r--examples/pdf/singlepage/resources/rotate-left.svg (renamed from examples/pdf/pdfviewer/resources/rotate-left.svg)0
-rw-r--r--examples/pdf/singlepage/resources/rotate-right.svg (renamed from examples/pdf/pdfviewer/resources/rotate-right.svg)0
-rw-r--r--examples/pdf/singlepage/resources/test.pdf (renamed from examples/pdf/pdfviewer/resources/test.pdf)bin76633 -> 76633 bytes
-rw-r--r--examples/pdf/singlepage/resources/zoom-fit-best.svg (renamed from examples/pdf/pdfviewer/resources/zoom-fit-best.svg)0
-rw-r--r--examples/pdf/singlepage/resources/zoom-fit-width.svg (renamed from examples/pdf/pdfviewer/resources/zoom-fit-width.svg)0
-rw-r--r--examples/pdf/singlepage/resources/zoom-in.svg (renamed from examples/pdf/pdfviewer/resources/zoom-in.svg)0
-rw-r--r--examples/pdf/singlepage/resources/zoom-original.svg (renamed from examples/pdf/pdfviewer/resources/zoom-original.svg)0
-rw-r--r--examples/pdf/singlepage/resources/zoom-out.svg (renamed from examples/pdf/pdfviewer/resources/zoom-out.svg)0
-rw-r--r--examples/pdf/singlepage/singlepage.pro (renamed from examples/pdf/pdfviewer/pdfviewer.pro)2
-rw-r--r--examples/pdf/singlepage/viewer.qml (renamed from examples/pdf/pdfviewer/viewer.qml)39
-rw-r--r--examples/pdf/singlepage/viewer.qrc (renamed from examples/pdf/pdfviewer/viewer.qrc)2
35 files changed, 271 insertions, 76 deletions
diff --git a/examples/pdf/CMakeLists.txt b/examples/pdf/CMakeLists.txt
index 265d2ab8f..bdc1d0f05 100644
--- a/examples/pdf/CMakeLists.txt
+++ b/examples/pdf/CMakeLists.txt
@@ -1,4 +1,7 @@
-qt_internal_add_example(pdfviewer)
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+qt_internal_add_example(singlepage)
qt_internal_add_example(multipage)
if(NOT TARGET Qt::Svg)
message(WARNING "QtSvg is required as runtime dependency for qtpdfquick examples.")
diff --git a/examples/pdf/multipage/CMakeLists.txt b/examples/pdf/multipage/CMakeLists.txt
index 66f4fc7b8..8f8111c82 100644
--- a/examples/pdf/multipage/CMakeLists.txt
+++ b/examples/pdf/multipage/CMakeLists.txt
@@ -1,3 +1,6 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
cmake_minimum_required(VERSION 3.16)
project(multipage LANGUAGES CXX)
@@ -13,8 +16,19 @@ find_package(Qt6 REQUIRED COMPONENTS Gui Qml)
qt_add_executable(multipage
main.cpp
+ pdfapplication.h
+ pdfapplication.cpp
)
+if (APPLE AND NOT IOS)
+ set(MACOSX_BUNDLE_ICON_FILE multipage.icns)
+ set(app_icon_macos "${CMAKE_CURRENT_SOURCE_DIR}/resources/multipage.icns")
+ set_source_files_properties(${app_icon_macos} PROPERTIES
+ MACOSX_PACKAGE_LOCATION "Resources")
+ target_sources(multipage PRIVATE ${app_icon_macos})
+ set(MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/resources/macos/Info.plist")
+endif()
+
set_target_properties(multipage PROPERTIES
WIN32_EXECUTABLE TRUE
MACOSX_BUNDLE TRUE
@@ -49,7 +63,7 @@ set(viewer_resource_files
qt_add_resources(multipage "viewer"
PREFIX
- "/pdfviewer"
+ "/multipage"
FILES
${viewer_resource_files}
)
diff --git a/examples/pdf/multipage/doc/src/multipage.qdoc b/examples/pdf/multipage/doc/src/multipage.qdoc
index 7ab4984bc..7ce4b4a8b 100644
--- a/examples/pdf/multipage/doc/src/multipage.qdoc
+++ b/examples/pdf/multipage/doc/src/multipage.qdoc
@@ -3,7 +3,9 @@
/*!
\example multipage
+ \meta installpath pdf
\ingroup qtpdf-examples
+ \examplecategory {User Interface Components}
\title PDF Multipage Viewer Example
\brief A Qt Quick PDF viewer that allows scrolling through the pages.
@@ -52,4 +54,6 @@
\printuntil
\section1 Files and Attributions
+
+ \sa {PDF Single Page Viewer Example}
*/
diff --git a/examples/pdf/multipage/main.cpp b/examples/pdf/multipage/main.cpp
index f5b246ac4..b9c31c7f8 100644
--- a/examples/pdf/multipage/main.cpp
+++ b/examples/pdf/multipage/main.cpp
@@ -1,7 +1,8 @@
// Copyright (C) 2020 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-#include <QGuiApplication>
+#include "pdfapplication.h"
+#include <QDir>
#include <QQmlApplicationEngine>
int main(int argc, char* argv[])
@@ -9,17 +10,18 @@ int main(int argc, char* argv[])
QCoreApplication::setApplicationName("Qt Quick Multi-page PDF Viewer Example");
QCoreApplication::setOrganizationName("QtProject");
QCoreApplication::setApplicationVersion(QT_VERSION_STR);
- QGuiApplication app(argc, argv);
+ PdfApplication app(argc, argv);
QQmlApplicationEngine engine;
- engine.load(QUrl(QStringLiteral("qrc:///pdfviewer/viewer.qml")));
+ engine.load(QUrl(QStringLiteral("qrc:///multipage/viewer.qml")));
+ app.setFileOpener(engine.rootObjects().constFirst());
if (app.arguments().count() > 1) {
- QUrl toLoad = QUrl::fromUserInput(app.arguments().at(1));
- engine.rootObjects().first()->setProperty("source", toLoad);
+ // alternatively, use QUrl::fromLocalFile(): network loading is not supported yet
+ QUrl toLoad = QUrl::fromUserInput(app.arguments().at(1), QDir::currentPath(), QUrl::AssumeLocalFile);
+ engine.rootObjects().constFirst()->setProperty("source", toLoad);
} else {
- engine.rootObjects().first()->setProperty("source", QStringLiteral("resources/test.pdf"));
+ engine.rootObjects().constFirst()->setProperty("source", QStringLiteral("resources/test.pdf"));
}
-
return app.exec();
}
diff --git a/examples/pdf/multipage/multipage.pro b/examples/pdf/multipage/multipage.pro
index bd08ba0de..c12651335 100644
--- a/examples/pdf/multipage/multipage.pro
+++ b/examples/pdf/multipage/multipage.pro
@@ -2,7 +2,7 @@ TEMPLATE = app
QT += qml quick pdf svg
-SOURCES += main.cpp
+SOURCES += main.cpp pdfapplication.cpp
RESOURCES += \
viewer.qrc
@@ -12,3 +12,5 @@ EXAMPLE_FILES = \
target.path = $$[QT_INSTALL_EXAMPLES]/pdf/multipage
INSTALLS += target
+macos:QMAKE_INFO_PLIST = resources/macos/Info.plist
+macos:ICON = resources/multipage.icns
diff --git a/examples/pdf/multipage/pdfapplication.cpp b/examples/pdf/multipage/pdfapplication.cpp
new file mode 100644
index 000000000..d8e7c6486
--- /dev/null
+++ b/examples/pdf/multipage/pdfapplication.cpp
@@ -0,0 +1,16 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#include "pdfapplication.h"
+#include <QFileOpenEvent>
+
+PdfApplication::PdfApplication(int &argc, char **argv)
+ : QGuiApplication(argc, argv) { }
+
+bool PdfApplication::event(QEvent *e) {
+ if (e->type() == QEvent::FileOpen) {
+ QFileOpenEvent *foEvent = static_cast<QFileOpenEvent *>(e);
+ m_fileOpener->setProperty("source", foEvent->url());
+ }
+ return QGuiApplication::event(e);
+}
diff --git a/examples/pdf/multipage/pdfapplication.h b/examples/pdf/multipage/pdfapplication.h
new file mode 100644
index 000000000..06c998e1c
--- /dev/null
+++ b/examples/pdf/multipage/pdfapplication.h
@@ -0,0 +1,24 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#ifndef PDFAPPLICATION_H
+#define PDFAPPLICATION_H
+
+#include <QGuiApplication>
+#include <QObject>
+
+class PdfApplication : public QGuiApplication
+{
+public:
+ PdfApplication(int &argc, char **argv);
+ void setFileOpener(QObject *opener) {
+ m_fileOpener = opener;
+ }
+
+protected:
+ bool event(QEvent *e) override;
+
+ QObject *m_fileOpener;
+};
+
+#endif // PDFAPPLICATION_H
diff --git a/examples/pdf/multipage/resources/macos/Info.plist b/examples/pdf/multipage/resources/macos/Info.plist
new file mode 100644
index 000000000..512becda0
--- /dev/null
+++ b/examples/pdf/multipage/resources/macos/Info.plist
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
+<plist version="0.1">
+<dict>
+ <key>CFBundleIconFile</key>
+ <string>multipage</string>
+ <key>CFBundleIdentifier</key>
+ <string>org.qt-project.multipage</string>
+ <key>CFBundleDisplayName</key>
+ <string>Multi-page PDF Viewer</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleExecutable</key>
+ <string>multipage</string>
+ <key>CFBundleDocumentTypes</key>
+ <array>
+ <dict>
+ <key>CFBundleTypeRole</key>
+ <string>Viewer</string>
+ <key>CFBundleTypeName</key>
+ <string>pdf</string>
+ <key>LSItemContentTypes</key>
+ <array>
+ <string>com.adobe.pdf</string>
+ </array>
+ </dict>
+ </array>
+</dict>
+</plist>
diff --git a/examples/pdf/multipage/resources/multipage.icns b/examples/pdf/multipage/resources/multipage.icns
new file mode 100644
index 000000000..2e3756903
--- /dev/null
+++ b/examples/pdf/multipage/resources/multipage.icns
Binary files differ
diff --git a/examples/pdf/multipage/viewer.qml b/examples/pdf/multipage/viewer.qml
index 56e7188f6..55ca2994a 100644
--- a/examples/pdf/multipage/viewer.qml
+++ b/examples/pdf/multipage/viewer.qml
@@ -22,7 +22,7 @@ ApplicationWindow {
ToolButton {
action: Action {
shortcut: StandardKey.Open
- icon.source: "qrc:/pdfviewer/resources/document-open.svg"
+ icon.source: "qrc:/multipage/resources/document-open.svg"
onTriggered: fileDialog.open()
}
}
@@ -30,7 +30,7 @@ ApplicationWindow {
action: Action {
shortcut: StandardKey.ZoomIn
enabled: view.renderScale < 10
- icon.source: "qrc:/pdfviewer/resources/zoom-in.svg"
+ icon.source: "qrc:/multipage/resources/zoom-in.svg"
onTriggered: view.renderScale *= Math.sqrt(2)
}
}
@@ -38,46 +38,46 @@ ApplicationWindow {
action: Action {
shortcut: StandardKey.ZoomOut
enabled: view.renderScale > 0.1
- icon.source: "qrc:/pdfviewer/resources/zoom-out.svg"
+ icon.source: "qrc:/multipage/resources/zoom-out.svg"
onTriggered: view.renderScale /= Math.sqrt(2)
}
}
ToolButton {
action: Action {
- icon.source: "qrc:/pdfviewer/resources/zoom-fit-width.svg"
+ icon.source: "qrc:/multipage/resources/zoom-fit-width.svg"
onTriggered: view.scaleToWidth(root.contentItem.width, root.contentItem.height)
}
}
ToolButton {
action: Action {
- icon.source: "qrc:/pdfviewer/resources/zoom-fit-best.svg"
+ icon.source: "qrc:/multipage/resources/zoom-fit-best.svg"
onTriggered: view.scaleToPage(root.contentItem.width, root.contentItem.height)
}
}
ToolButton {
action: Action {
shortcut: "Ctrl+0"
- icon.source: "qrc:/pdfviewer/resources/zoom-original.svg"
+ icon.source: "qrc:/multipage/resources/zoom-original.svg"
onTriggered: view.resetScale()
}
}
ToolButton {
action: Action {
shortcut: "Ctrl+L"
- icon.source: "qrc:/pdfviewer/resources/rotate-left.svg"
+ icon.source: "qrc:/multipage/resources/rotate-left.svg"
onTriggered: view.pageRotation -= 90
}
}
ToolButton {
action: Action {
shortcut: "Ctrl+R"
- icon.source: "qrc:/pdfviewer/resources/rotate-right.svg"
+ icon.source: "qrc:/multipage/resources/rotate-right.svg"
onTriggered: view.pageRotation += 90
}
}
ToolButton {
action: Action {
- icon.source: "qrc:/pdfviewer/resources/go-previous-view-page.svg"
+ icon.source: "qrc:/multipage/resources/go-previous-view-page.svg"
enabled: view.backEnabled
onTriggered: view.back()
}
@@ -102,7 +102,7 @@ ApplicationWindow {
}
ToolButton {
action: Action {
- icon.source: "qrc:/pdfviewer/resources/go-next-view-page.svg"
+ icon.source: "qrc:/multipage/resources/go-next-view-page.svg"
enabled: view.forwardEnabled
onTriggered: view.forward()
}
@@ -113,21 +113,24 @@ ApplicationWindow {
ToolButton {
action: Action {
shortcut: StandardKey.SelectAll
- icon.source: "qrc:/pdfviewer/resources/edit-select-all.svg"
+ icon.source: "qrc:/multipage/resources/edit-select-all.svg"
onTriggered: view.selectAll()
}
}
ToolButton {
action: Action {
shortcut: StandardKey.Copy
- icon.source: "qrc:/pdfviewer/resources/edit-copy.svg"
+ icon.source: "qrc:/multipage/resources/edit-copy.svg"
enabled: view.selectedText !== ""
onTriggered: view.copySelectionToClipboard()
}
}
Shortcut {
sequence: StandardKey.Find
- onActivated: searchField.forceActiveFocus()
+ onActivated: {
+ searchField.forceActiveFocus()
+ searchField.selectAll()
+ }
}
Shortcut {
sequence: StandardKey.Quit
@@ -194,6 +197,19 @@ ApplicationWindow {
onCurrentPageChanged: currentPageSB.value = view.currentPage + 1
}
+ DropArea {
+ anchors.fill: parent
+ keys: ["text/uri-list"]
+ onEntered: (drag) => {
+ drag.accepted = (drag.proposedAction === Qt.MoveAction || drag.proposedAction === Qt.CopyAction) &&
+ drag.hasUrls && drag.urls[0].endsWith("pdf")
+ }
+ onDropped: (drop) => {
+ doc.source = drop.urls[0]
+ drop.acceptProposedAction()
+ }
+ }
+
Drawer {
id: sidebar
edge: Qt.LeftEdge
@@ -374,7 +390,7 @@ ApplicationWindow {
id: sidebarOpenAction
checkable: true
checked: sidebar.opened
- icon.source: checked ? "qrc:/pdfviewer/resources/sidebar-collapse-left.svg" : "qrc:/pdfviewer/resources/sidebar-expand-left.svg"
+ icon.source: checked ? "qrc:/multipage/resources/sidebar-collapse-left.svg" : "qrc:/multipage/resources/sidebar-expand-left.svg"
onTriggered: sidebar.open()
}
ToolTip.visible: enabled && hovered
@@ -383,8 +399,9 @@ ApplicationWindow {
}
ToolButton {
action: Action {
- icon.source: "qrc:/pdfviewer/resources/go-up-search.svg"
+ icon.source: "qrc:/multipage/resources/go-up-search.svg"
shortcut: StandardKey.FindPrevious
+ enabled: view.searchModel.count > 0
onTriggered: view.searchBack()
}
ToolTip.visible: enabled && hovered
@@ -399,11 +416,11 @@ ApplicationWindow {
Layout.bottomMargin: 3
onAccepted: {
sidebar.open()
- sidebarTabs.setCurrentIndex(0)
+ sidebarTabs.setCurrentIndex(1)
}
Image {
visible: searchField.text !== ""
- source: "qrc:/pdfviewer/resources/edit-clear.svg"
+ source: "qrc:/multipage/resources/edit-clear.svg"
sourceSize.height: searchField.height - 6
anchors {
right: parent.right
@@ -417,8 +434,9 @@ ApplicationWindow {
}
ToolButton {
action: Action {
- icon.source: "qrc:/pdfviewer/resources/go-down-search.svg"
+ icon.source: "qrc:/multipage/resources/go-down-search.svg"
shortcut: StandardKey.FindNext
+ enabled: view.searchModel.count > 0
onTriggered: view.searchForward()
}
ToolTip.visible: enabled && hovered
diff --git a/examples/pdf/multipage/viewer.qrc b/examples/pdf/multipage/viewer.qrc
index 541ff3016..e786ae4ce 100644
--- a/examples/pdf/multipage/viewer.qrc
+++ b/examples/pdf/multipage/viewer.qrc
@@ -1,5 +1,5 @@
<RCC>
- <qresource prefix="/pdfviewer">
+ <qresource prefix="/singlepage">
<file>viewer.qml</file>
<file>resources/document-open.svg</file>
<file>resources/edit-clear.svg</file>
diff --git a/examples/pdf/pdf.pro b/examples/pdf/pdf.pro
index 0ae198ee7..96ead5948 100644
--- a/examples/pdf/pdf.pro
+++ b/examples/pdf/pdf.pro
@@ -1,3 +1,3 @@
TEMPLATE=subdirs
-qtHaveModule(svg): SUBDIRS += pdfviewer multipage
+qtHaveModule(svg): SUBDIRS += singlepage multipage
diff --git a/examples/pdf/pdfviewer/main.cpp b/examples/pdf/pdfviewer/main.cpp
deleted file mode 100644
index da940dd3f..000000000
--- a/examples/pdf/pdfviewer/main.cpp
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (C) 2020 The Qt Company Ltd.
-// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-
-#include <QGuiApplication>
-#include <QQmlApplicationEngine>
-
-int main(int argc, char* argv[])
-{
- QCoreApplication::setApplicationName("Qt Quick PDF Viewer Example");
- QCoreApplication::setOrganizationName("QtProject");
- QCoreApplication::setApplicationVersion(QT_VERSION_STR);
- QGuiApplication app(argc, argv);
-
- QQmlApplicationEngine engine;
- engine.load(QUrl(QStringLiteral("qrc:///pdfviewer/viewer.qml")));
- if (app.arguments().count() > 1) {
- QUrl toLoad = QUrl::fromUserInput(app.arguments().at(1));
- engine.rootObjects().first()->setProperty("source", toLoad);
- } else {
- engine.rootObjects().first()->setProperty("source", QStringLiteral("resources/test.pdf"));
- }
-
- return app.exec();
-}
diff --git a/examples/pdf/pdfviewer/CMakeLists.txt b/examples/pdf/singlepage/CMakeLists.txt
index 179734dc4..fac95f54a 100644
--- a/examples/pdf/pdfviewer/CMakeLists.txt
+++ b/examples/pdf/singlepage/CMakeLists.txt
@@ -1,5 +1,8 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
cmake_minimum_required(VERSION 3.16)
-project(pdfviewer LANGUAGES CXX)
+project(singlepage LANGUAGES CXX)
set(CMAKE_AUTOMOC ON)
@@ -7,7 +10,7 @@ if(NOT DEFINED INSTALL_EXAMPLESDIR)
set(INSTALL_EXAMPLESDIR "examples")
endif()
-set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/pdf/pdfviewer")
+set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/pdf/singlepage")
find_package(Qt6 REQUIRED COMPONENTS Gui Qml)
@@ -47,7 +50,7 @@ set(viewer_resource_files
qt_add_resources(pdfviewerquick "viewer"
PREFIX
- "/pdfviewer"
+ "/singlepage"
FILES
${viewer_resource_files}
)
diff --git a/examples/pdf/singlepage/doc/src/singlepage.qdoc b/examples/pdf/singlepage/doc/src/singlepage.qdoc
new file mode 100644
index 000000000..773f9acae
--- /dev/null
+++ b/examples/pdf/singlepage/doc/src/singlepage.qdoc
@@ -0,0 +1,62 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \example singlepage
+ \meta installpath pdf
+ \ingroup qtpdf-examples
+ \examplecategory {User Interface Components}
+
+ \title PDF Single Page Viewer Example
+ \brief A Qt Quick PDF viewer that views one page at a time.
+
+ \image singlepageviewer.webp
+
+ \e {PDF Single Page Viewer Example} demonstrates how to use the PdfScrollablePageView
+ component to render PDF documents and search for text in them.
+
+ \include examples-run.qdocinc
+
+ \section1 Creating the Main Window
+
+ Instantiate an \l ApplicationWindow, bind its title to the title of the
+ PDF document, and create a toolbar:
+
+ \quotefromfile singlepage/viewer.qml
+ \skipto ApplicationWindow
+ \printuntil rightMargin
+
+ The toolbar has buttons for most of the common actions,
+ plus a SpinBox to show and control the current page number:
+
+ \printuntil ZoomOut
+ \dots
+ \skipto SpinBox
+ \printto onValueModified
+ \dots
+
+ Add dialogs to inform the user when an error occurs and to prompt for a
+ password if required:
+
+ \skipto onAccepted
+ \skipto Dialog
+ \printto PdfScrollablePageView
+
+ Add the main component, PdfScrollablePageView:
+
+ \printto Drawer {
+
+ A \l Drawer holds a ListView to show search results from the
+ \l {PdfScrollablePageView::searchModel}{searchModel}:
+
+ \printto ToolBar
+
+ Finally, add a second toolbar as a footer, to hold the search field,
+ search up/down buttons and some status information:
+
+ \printuntil
+
+ \section1 Files and Attributions
+
+ \sa {PDF Multipage Viewer Example}
+*/
diff --git a/examples/pdf/singlepage/main.cpp b/examples/pdf/singlepage/main.cpp
new file mode 100644
index 000000000..be5c8f73c
--- /dev/null
+++ b/examples/pdf/singlepage/main.cpp
@@ -0,0 +1,37 @@
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#include <QQmlApplicationEngine>
+
+#include <QGuiApplication>
+
+#include <QCommandLineParser>
+#include <QCommandLineOption>
+
+int main(int argc, char* argv[])
+{
+ QCoreApplication::setApplicationName("Qt Quick PDF Viewer Example");
+ QCoreApplication::setOrganizationName("QtProject");
+ QCoreApplication::setApplicationVersion(QT_VERSION_STR);
+ QGuiApplication app(argc, argv);
+
+ QCommandLineParser parser;
+ parser.addHelpOption();
+ parser.addVersionOption();
+ parser.addPositionalArgument("file", "The file to open.");
+ parser.process(app);
+
+ QQmlApplicationEngine engine;
+
+ QUrl toLoad = QUrl("qrc:/singlepage/resources/test.pdf");
+ if (!parser.positionalArguments().isEmpty())
+ toLoad = QUrl::fromLocalFile(parser.positionalArguments().constFirst());
+
+ engine.setInitialProperties({{"source", toLoad}});
+
+ engine.load(QUrl(QStringLiteral("qrc:///singlepage/viewer.qml")));
+ if (engine.rootObjects().isEmpty())
+ return -1;
+
+ return app.exec();
+}
diff --git a/examples/pdf/pdfviewer/resources/document-open.svg b/examples/pdf/singlepage/resources/document-open.svg
index bf23123a3..bf23123a3 100644
--- a/examples/pdf/pdfviewer/resources/document-open.svg
+++ b/examples/pdf/singlepage/resources/document-open.svg
diff --git a/examples/pdf/pdfviewer/resources/edit-clear.svg b/examples/pdf/singlepage/resources/edit-clear.svg
index 1c35aaf04..1c35aaf04 100644
--- a/examples/pdf/pdfviewer/resources/edit-clear.svg
+++ b/examples/pdf/singlepage/resources/edit-clear.svg
diff --git a/examples/pdf/pdfviewer/resources/edit-copy.svg b/examples/pdf/singlepage/resources/edit-copy.svg
index 9dd16877d..9dd16877d 100644
--- a/examples/pdf/pdfviewer/resources/edit-copy.svg
+++ b/examples/pdf/singlepage/resources/edit-copy.svg
diff --git a/examples/pdf/pdfviewer/resources/edit-select-all.svg b/examples/pdf/singlepage/resources/edit-select-all.svg
index 5f21950a0..5f21950a0 100644
--- a/examples/pdf/pdfviewer/resources/edit-select-all.svg
+++ b/examples/pdf/singlepage/resources/edit-select-all.svg
diff --git a/examples/pdf/pdfviewer/resources/go-down-search.svg b/examples/pdf/singlepage/resources/go-down-search.svg
index ae17ab93b..ae17ab93b 100644
--- a/examples/pdf/pdfviewer/resources/go-down-search.svg
+++ b/examples/pdf/singlepage/resources/go-down-search.svg
diff --git a/examples/pdf/pdfviewer/resources/go-next-view-page.svg b/examples/pdf/singlepage/resources/go-next-view-page.svg
index e453ddbec..e453ddbec 100644
--- a/examples/pdf/pdfviewer/resources/go-next-view-page.svg
+++ b/examples/pdf/singlepage/resources/go-next-view-page.svg
diff --git a/examples/pdf/pdfviewer/resources/go-previous-view-page.svg b/examples/pdf/singlepage/resources/go-previous-view-page.svg
index b032309e9..b032309e9 100644
--- a/examples/pdf/pdfviewer/resources/go-previous-view-page.svg
+++ b/examples/pdf/singlepage/resources/go-previous-view-page.svg
diff --git a/examples/pdf/pdfviewer/resources/go-up-search.svg b/examples/pdf/singlepage/resources/go-up-search.svg
index 5cc155873..5cc155873 100644
--- a/examples/pdf/pdfviewer/resources/go-up-search.svg
+++ b/examples/pdf/singlepage/resources/go-up-search.svg
diff --git a/examples/pdf/pdfviewer/resources/rotate-left.svg b/examples/pdf/singlepage/resources/rotate-left.svg
index 90ce53c9d..90ce53c9d 100644
--- a/examples/pdf/pdfviewer/resources/rotate-left.svg
+++ b/examples/pdf/singlepage/resources/rotate-left.svg
diff --git a/examples/pdf/pdfviewer/resources/rotate-right.svg b/examples/pdf/singlepage/resources/rotate-right.svg
index 7383d1c84..7383d1c84 100644
--- a/examples/pdf/pdfviewer/resources/rotate-right.svg
+++ b/examples/pdf/singlepage/resources/rotate-right.svg
diff --git a/examples/pdf/pdfviewer/resources/test.pdf b/examples/pdf/singlepage/resources/test.pdf
index 0832dfbed..0832dfbed 100644
--- a/examples/pdf/pdfviewer/resources/test.pdf
+++ b/examples/pdf/singlepage/resources/test.pdf
Binary files differ
diff --git a/examples/pdf/pdfviewer/resources/zoom-fit-best.svg b/examples/pdf/singlepage/resources/zoom-fit-best.svg
index adf302621..adf302621 100644
--- a/examples/pdf/pdfviewer/resources/zoom-fit-best.svg
+++ b/examples/pdf/singlepage/resources/zoom-fit-best.svg
diff --git a/examples/pdf/pdfviewer/resources/zoom-fit-width.svg b/examples/pdf/singlepage/resources/zoom-fit-width.svg
index 985ee5205..985ee5205 100644
--- a/examples/pdf/pdfviewer/resources/zoom-fit-width.svg
+++ b/examples/pdf/singlepage/resources/zoom-fit-width.svg
diff --git a/examples/pdf/pdfviewer/resources/zoom-in.svg b/examples/pdf/singlepage/resources/zoom-in.svg
index efdc9f17d..efdc9f17d 100644
--- a/examples/pdf/pdfviewer/resources/zoom-in.svg
+++ b/examples/pdf/singlepage/resources/zoom-in.svg
diff --git a/examples/pdf/pdfviewer/resources/zoom-original.svg b/examples/pdf/singlepage/resources/zoom-original.svg
index 1b4080a03..1b4080a03 100644
--- a/examples/pdf/pdfviewer/resources/zoom-original.svg
+++ b/examples/pdf/singlepage/resources/zoom-original.svg
diff --git a/examples/pdf/pdfviewer/resources/zoom-out.svg b/examples/pdf/singlepage/resources/zoom-out.svg
index fcde9e526..fcde9e526 100644
--- a/examples/pdf/pdfviewer/resources/zoom-out.svg
+++ b/examples/pdf/singlepage/resources/zoom-out.svg
diff --git a/examples/pdf/pdfviewer/pdfviewer.pro b/examples/pdf/singlepage/singlepage.pro
index a1c578efc..3b9f6399d 100644
--- a/examples/pdf/pdfviewer/pdfviewer.pro
+++ b/examples/pdf/singlepage/singlepage.pro
@@ -9,6 +9,6 @@ RESOURCES += \
EXAMPLE_FILES = \
viewer.qml
-target.path = $$[QT_INSTALL_EXAMPLES]/pdf/pdfviewer
+target.path = $$[QT_INSTALL_EXAMPLES]/pdf/singlepage
INSTALLS += target
diff --git a/examples/pdf/pdfviewer/viewer.qml b/examples/pdf/singlepage/viewer.qml
index 9f78c1404..9b6668a3a 100644
--- a/examples/pdf/pdfviewer/viewer.qml
+++ b/examples/pdf/singlepage/viewer.qml
@@ -13,7 +13,7 @@ ApplicationWindow {
color: "lightgrey"
title: document.title
visible: true
- property string source // for main.cpp
+ required property url source // for main.cpp
property real scaleStep: Math.sqrt(2)
header: ToolBar {
@@ -23,7 +23,7 @@ ApplicationWindow {
ToolButton {
action: Action {
shortcut: StandardKey.Open
- icon.source: "qrc:/pdfviewer/resources/document-open.svg"
+ icon.source: "qrc:/singlepage/resources/document-open.svg"
onTriggered: fileDialog.open()
}
}
@@ -31,7 +31,7 @@ ApplicationWindow {
action: Action {
shortcut: StandardKey.ZoomIn
enabled: view.sourceSize.width < 10000
- icon.source: "qrc:/pdfviewer/resources/zoom-in.svg"
+ icon.source: "qrc:/singlepage/resources/zoom-in.svg"
onTriggered: view.renderScale *= root.scaleStep
}
}
@@ -39,46 +39,46 @@ ApplicationWindow {
action: Action {
shortcut: StandardKey.ZoomOut
enabled: view.sourceSize.width > 50
- icon.source: "qrc:/pdfviewer/resources/zoom-out.svg"
+ icon.source: "qrc:/singlepage/resources/zoom-out.svg"
onTriggered: view.renderScale /= root.scaleStep
}
}
ToolButton {
action: Action {
- icon.source: "qrc:/pdfviewer/resources/zoom-fit-width.svg"
+ icon.source: "qrc:/singlepage/resources/zoom-fit-width.svg"
onTriggered: view.scaleToWidth(root.contentItem.width, root.contentItem.height)
}
}
ToolButton {
action: Action {
- icon.source: "qrc:/pdfviewer/resources/zoom-fit-best.svg"
+ icon.source: "qrc:/singlepage/resources/zoom-fit-best.svg"
onTriggered: view.scaleToPage(root.contentItem.width, root.contentItem.height)
}
}
ToolButton {
action: Action {
shortcut: "Ctrl+0"
- icon.source: "qrc:/pdfviewer/resources/zoom-original.svg"
+ icon.source: "qrc:/singlepage/resources/zoom-original.svg"
onTriggered: view.resetScale()
}
}
ToolButton {
action: Action {
shortcut: "Ctrl+L"
- icon.source: "qrc:/pdfviewer/resources/rotate-left.svg"
+ icon.source: "qrc:/singlepage/resources/rotate-left.svg"
onTriggered: view.pageRotation -= 90
}
}
ToolButton {
action: Action {
shortcut: "Ctrl+R"
- icon.source: "qrc:/pdfviewer/resources/rotate-right.svg"
+ icon.source: "qrc:/singlepage/resources/rotate-right.svg"
onTriggered: view.pageRotation += 90
}
}
ToolButton {
action: Action {
- icon.source: "qrc:/pdfviewer/resources/go-previous-view-page.svg"
+ icon.source: "qrc:/singlepage/resources/go-previous-view-page.svg"
enabled: view.backEnabled
onTriggered: view.back()
}
@@ -104,7 +104,7 @@ ApplicationWindow {
}
ToolButton {
action: Action {
- icon.source: "qrc:/pdfviewer/resources/go-next-view-page.svg"
+ icon.source: "qrc:/singlepage/resources/go-next-view-page.svg"
enabled: view.forwardEnabled
onTriggered: view.forward()
}
@@ -115,21 +115,24 @@ ApplicationWindow {
ToolButton {
action: Action {
shortcut: StandardKey.SelectAll
- icon.source: "qrc:/pdfviewer/resources/edit-select-all.svg"
+ icon.source: "qrc:/singlepage/resources/edit-select-all.svg"
onTriggered: view.selectAll()
}
}
ToolButton {
action: Action {
shortcut: StandardKey.Copy
- icon.source: "qrc:/pdfviewer/resources/edit-copy.svg"
+ icon.source: "qrc:/singlepage/resources/edit-copy.svg"
enabled: view.selectedText !== ""
onTriggered: view.copySelectionToClipboard()
}
}
Shortcut {
sequence: StandardKey.Find
- onActivated: searchField.forceActiveFocus()
+ onActivated: {
+ searchField.forceActiveFocus()
+ searchField.selectAll()
+ }
}
Shortcut {
sequence: StandardKey.Quit
@@ -254,8 +257,9 @@ ApplicationWindow {
anchors.fill: parent
ToolButton {
action: Action {
- icon.source: "qrc:/pdfviewer/resources/go-up-search.svg"
+ icon.source: "qrc:/singlepage/resources/go-up-search.svg"
shortcut: StandardKey.FindPrevious
+ enabled: view.searchModel.count > 0
onTriggered: view.searchBack()
}
ToolTip.visible: enabled && hovered
@@ -271,7 +275,7 @@ ApplicationWindow {
onAccepted: searchDrawer.open()
Image {
visible: searchField.text !== ""
- source: "qrc:/pdfviewer/resources/edit-clear.svg"
+ source: "qrc:/singlepage/resources/edit-clear.svg"
anchors {
right: parent.right
top: parent.top
@@ -286,8 +290,9 @@ ApplicationWindow {
}
ToolButton {
action: Action {
- icon.source: "qrc:/pdfviewer/resources/go-down-search.svg"
+ icon.source: "qrc:/singlepage/resources/go-down-search.svg"
shortcut: StandardKey.FindNext
+ enabled: view.searchModel.count > 0
onTriggered: view.searchForward()
}
ToolTip.visible: enabled && hovered
diff --git a/examples/pdf/pdfviewer/viewer.qrc b/examples/pdf/singlepage/viewer.qrc
index ffca51679..6f8af53ac 100644
--- a/examples/pdf/pdfviewer/viewer.qrc
+++ b/examples/pdf/singlepage/viewer.qrc
@@ -1,5 +1,5 @@
<RCC>
- <qresource prefix="/pdfviewer">
+ <qresource prefix="/singlepage">
<file>viewer.qml</file>
<file>resources/document-open.svg</file>
<file>resources/edit-clear.svg</file>