En esta página

Ejemplo de widget visor de PDF

Un visor de PDF basado en widgets que permite desplazarse por las páginas.

Visor de PDF con panel de marcadores a la izquierda y área de visualización principal a la derecha que muestra la portada del documento.

PDF Viewer demuestra cómo utilizar la clase QPdfView para representar documentos PDF y la clase QPdfPageNavigator para navegar por ellos.

Qt Creator y el diseñador integrado Qt Widgets Designer se utilizaron para crear la interfaz de usuario de ejemplo y conectarla al código. Esto afecta al código, que puede ser algo diferente de lo que normalmente escribiría a mano. Para más información sobre el uso de Qt Widgets Designer, consulte Qt Widgets Designer Manual y Qt Creator: Tutorial: Qt Widgets application.

Ejecutar el ejemplo

Para ejecutar el ejemplo desde Qt Creatorabra el modo Welcome y seleccione el ejemplo de Examples. Para más información, consulte Qt Creator: Tutorial: Construir y ejecutar.

Creando la Ventana Principal

La clase MainWindow hereda la clase QMainWindow:

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

La clase declara ranuras públicas y privadas que coinciden con las acciones de los selectores:

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();

El diseño real de la ventana principal se especifica en un archivo .ui. Los widgets y las acciones están disponibles en tiempo de ejecución en la variable miembro ui.

    void on_actionFindNext_triggered();
    void on_actionFindPrevious_triggered();

private:
    Ui::MainWindow *ui;

La variable m_zoomSelector contiene el selector de zoom y la m_pageSelector contiene el selector de página. La variable m_document es una instancia de la clase QPdfDocument que contiene el documento PDF.

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

    QPdfDocument *m_document;
};

La configuración real de los diferentes objetos se realiza en el constructor 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))
{

El constructor primero llama a setupUi() para construir la mayor parte de la ventana principal de acuerdo con el archivo UI. El zoom y los selectores de página necesitan ser añadidos a la barra de herramientas a través de QToolBar::insertWidget(), porque eso no se puede hacer en un fichero UI:

    ui->setupUi(this);

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

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

Conectamos las señales relevantes al selector de página y a los botones de avance y retroceso:

    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);

Conectamos las señales de cambio zoomModeChanged y zoomFactor de la vista PDF a las funciones que reinician el selector de zoom:

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

A continuación, cargamos el documento PDF en el visor:

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

Por último, conectamos la señal zoomFactorChanged a la función que fija el valor del selector de zoom:

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

Archivos y Atribuciones

Proyecto de ejemplo @ code.qt.io

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.