PDFビューアウィジェット例

ページをスクロールできるウィジェットベースのPDFビューア。

PDF ViewerはQPdfView クラスを使ってPDFドキュメントをレンダリングし、QPdfPageNavigator クラスを使ってそれらをナビゲートする方法を示しています。

サンプルUIの作成とコードへの接続には、Qt Creatorと統合されたQt Widgets Designerを使用しました。これはコードに影響し、通常手で書くものとは多少異なるかもしれません。Qt Widgets Designer の使用方法については、Qt Widgets Designer ManualおよびQt Creator を参照してください:Creating a Qt Widget Based Application」を参照してください。

例の実行

Qt Creator からサンプルを実行するには、Welcome モードを開き、Examples からサンプルを選択します。詳細については、Building and Running an Example を参照してください。

メインウィンドウの作成

MainWindow クラスはQMainWindow クラスを継承しています:

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

このクラスはセレクタのアクションにマッチするpublicとprivateスロットを宣言します:

public slots:
    void open(const QUrl &docLocation);

private slots:
    void bookmarkSelected(const QModelIndex &index);
    void pageSelected(int page);
    void searchResultSelected(const QModelIndex &current, const QModelIndex &previous);

    // action handlers
    void on_actionOpen_triggered();
    void on_actionQuit_triggered();
    void on_actionAbout_triggered();
    void on_actionAbout_Qt_triggered();
    void on_actionZoom_In_triggered();
    void on_actionZoom_Out_triggered();
    void on_actionPrevious_Page_triggered();
    void on_actionNext_Page_triggered();
    void on_thumbnailsView_activated(const QModelIndex &index);
    void on_actionContinuous_triggered();
    void on_actionBack_triggered();
    void on_actionForward_triggered();

メイン・ウィンドウの実際のレイアウトは、.ui ファイルで指定します。ウィジェットとアクションは、ui メンバ変数で実行時に利用可能です。

    void on_actionFindNext_triggered();
    void on_actionFindPrevious_triggered();

private:
    Ui::MainWindow *ui;

変数m_zoomSelector にはズーム・セレクタが、m_pageSelector にはページ・セレクタが格納されている。m_document 変数は、PDF文書を含むQPdfDocument クラスのインスタンスです。

    ZoomSelector *m_zoomSelector;
    QPdfPageSelector *m_pageSelector;
    QPdfSearchModel *m_searchModel;
    QLineEdit *m_searchField;
    QFileDialog *m_fileDialog = nullptr;

    QPdfDocument *m_document;
};

さ ま ざ ま な オブジ ェ ク ト の実際のセ ッ ト ア ッ プは MainWindow コンストラクタの中で行われます:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , m_zoomSelector(new ZoomSelector(this))
    , m_pageSelector(new QPdfPageSelector(this))
    , m_searchModel(new QPdfSearchModel(this))
    , m_searchField(new QLineEdit(this))
    , m_document(new QPdfDocument(this))
{

コ ン ス ト ラ ク タ は まずsetupUi() を呼び出 し て、 UI フ ァ イ ルに従っ た メ イ ン ウ ィ ン ド ウ の大部分を構築 し ます。QToolBar::insertWidgetなぜな ら こ れは UI フ ァ イ ルでは行 う こ と がで き ないか ら です:

    ui->setupUi(this);

    m_zoomSelector->setMaximumWidth(150);
    ui->mainToolBar->insertWidget(ui->actionZoom_In, m_zoomSelector);

    ui->mainToolBar->insertWidget(ui->actionForward, m_pageSelector);

ページ・セレクタのスピンボックスとブラウザ・スタイルの戻る・進むボタンに関連するシグナルを接続します:

    connect(m_pageSelector, &QPdfPageSelector::currentPageChanged, this, &MainWindow::pageSelected);
    m_pageSelector->setDocument(m_document);
    auto nav = ui->pdfView->pageNavigator();
    connect(nav, &QPdfPageNavigator::currentPageChanged, m_pageSelector, &QPdfPageSelector::setCurrentPage);
    connect(nav, &QPdfPageNavigator::backAvailableChanged, ui->actionBack, &QAction::setEnabled);
    connect(nav, &QPdfPageNavigator::forwardAvailableChanged, ui->actionForward, &QAction::setEnabled);

PDF ビ ュ ーのzoomModeChangedzoomFactor の変更信号を、 ズーム セ レ ク タ を リ セ ッ ト す る 関数に接続 し ます:

    connect(m_zoomSelector, &ZoomSelector::zoomModeChanged, ui->pdfView, &QPdfView::setZoomMode);
    connect(m_zoomSelector, &ZoomSelector::zoomFactorChanged, ui->pdfView, &QPdfView::setZoomFactor);
    m_zoomSelector->reset();

そ し て PDF 文書を ビ ュ ーアに読み込みます:

    ...
    ui->pdfView->setSearchModel(m_searchModel);

最後に、zoomFactorChanged シグナルを、ズームセレクタの値を設定する関数に接続します:

    ui->searchToolBar->insertWidget(ui->actionFindPrevious, m_searchField);
    connect(new QShortcut(QKeySequence::Find, this), &QShortcut::activated, this, [this]() {
        m_searchField->setFocus(Qt::ShortcutFocusReason);
    });

ファイルと帰属

サンプルプロジェクト @ code.qt.io

©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 ここで提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。