【自制软件】PDF学习宝-开发日记7--PDF阅读功能

337 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情


📒博客首页:何名取 的个人主页 - 文章 - 掘金 (juejin.cn)
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
❤️期待一起交流!
🙏作者水平很有限,如果发现错误,求告知,多谢!
🌺有问题可私信交流!!!


PDF阅读功能

前言

上一节使用Qt PDF中的一些类加上其他一些通用类实现了两个自定义的PDF相关的类,分别是PageSelector-自定义的页选择类、ZoomSelector-自定义的缩放选择类。本节就使用这两个类与Qt PDF模块中自带的QPdfDocument-PDF文档类实现PDF阅读功能。

自定义类的使用

自定义类的使用需要在widget.h中引入类:

class PageSelector;
class ZoomSelector;

并进行声明:

    ZoomSelector *m_zoomSelector;       //缩放调节
    PageSelector *m_pageSelector;       //页数跳转

改造widget.cpp的构造函数为:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , m_zoomSelector(new ZoomSelector(this))
    , m_pageSelector(new PageSelector(this))
    , m_document(new QPdfDocument(this))

修改布局

之前的布局中没有设计PDF阅读功能中的放缩和页跳转栏,这里对stackview的页面2布局做一下修改,将这些功能所需的控件添加到布局中。控件与布局如下图所示:

image.png

这些控件采用水平排列布局,然后再与之前的布局一起添加到垂直排列布局中,之后在页面2中应用总体的布局。

在widget.h中添加放大和缩小按钮:

    QPushButton *btn_zoom_in;           //放大
    QPushButton *btn_zoom_out;          //缩小

在widget.cpp的构造函数中修改页面2的布局:

    //页面2布局
    QVBoxLayout *lay2 = new QVBoxLayout;
    //pdf页数排列
    QHBoxLayout *lay_pdfnum = new QHBoxLayout;
    //缩小、放大
    btn_zoom_out = new QPushButton;
    btn_zoom_out->setIcon(QIcon(":/images/images/zoom-out-24.png"));
    btn_zoom_in = new QPushButton;
    btn_zoom_in->setIcon(QIcon(":/images/images/zoom-in-24.png"));
    m_zoomSelector->setMaximumWidth(150);
    //pdf页
    m_pageSelector->setMaximumWidth(150);
    //水平排列
    lay_pdfnum->addWidget(btn_zoom_out);
    lay_pdfnum->addWidget(m_zoomSelector);
    lay_pdfnum->addWidget(btn_zoom_in);
    lay_pdfnum->addWidget(m_pageSelector);
    lay_pdfnum->addStretch();//添加弹簧
    //pdf导航栏、显示和题库排列
    QHBoxLayout *lay_pdf = new QHBoxLayout;
    //导航栏
    navpdf = new QTreeView;
    navpdf->setMaximumWidth(winrect.width()/8);
    //pdf显示区域
    pdfview = new QPdfView;
    pdfview->resize(stackview->width()/8*5,stackview->height());
    pdfview->setPageMode(QPdfView::MultiPage);//设置为多页面
    //题库编辑与显示区域
    scra_q = new QScrollArea;
    scra_q->setMaximumWidth(winrect.width()/8*2);
    //设置排列
    lay_pdf->addWidget(navpdf);
    lay_pdf->addWidget(pdfview);
    lay_pdf->addWidget(scra_q);
    //设置排列
    lay2->addLayout(lay_pdfnum);
    lay2->addLayout(lay_pdf);
    //页面2排列
    page2 = new QWidget;
    page2->setLayout(lay2);
    stackview->addWidget(page2);

绑定

将类和控件实例化并进行布局之后,需要将这些控件与相应的处理函数进行绑定。

在widget.h中进行函数声明:

    void bookmarkSelected(const QModelIndex &index);

    void on_btn_zoom_in_clicked();      //设置放大响应
    void on_btn_zoom_out_clicked();     //设置缩小响应

在widget.cpp中绑定:

    //设置pdf导航栏
    m_pageSelector->setPageNavigation(pdfview->pageNavigation());

    //pdf模型
    QPdfBookmarkModel *bookmarkModel = new QPdfBookmarkModel(this);
    bookmarkModel->setDocument(m_document);
    navpdf->setModel(bookmarkModel);        //为pdf导航栏设置模型
    //为pdfview视图设置文档
    pdfview->setDocument(m_document);


    //槽函数
    connect(btn_close,SIGNAL(clicked()),this,SLOT(on_btn_close_clicked()));//关闭按钮
    connect(btn_min,SIGNAL(clicked()),this,SLOT(on_btn_min_clicked()));//最小化按钮
    connect(btn_max,SIGNAL(clicked()),this,SLOT(on_btn_max_clicked()));//最大化按钮
    connect(btn_setting,SIGNAL(clicked()),this,SLOT(on_btn_setting_clicked()));//设置按钮

    connect(open_pdf,SIGNAL(clicked()),this,SLOT(on_open_pdf_clicked()));//打开pdf按钮

    //绑定缩放选择中的缩放模式与pdf视图缩放模式
    connect(m_zoomSelector, &ZoomSelector::zoomModeChanged, pdfview, &QPdfView::setZoomMode);
    //绑定缩放选择中的缩放比例与pdf视图缩放比例
    connect(m_zoomSelector, &ZoomSelector::zoomFactorChanged, pdfview, &QPdfView::setZoomFactor);

    //绑定导航栏与pdf视图
    connect(navpdf, SIGNAL(activated(QModelIndex)), this, SLOT(bookmarkSelected(QModelIndex)));

    //绑定pdf缩放比例与缩放选择中的缩放比例
    connect(pdfview, &QPdfView::zoomFactorChanged,
            m_zoomSelector, &ZoomSelector::setZoomFactor);

    //缩小按钮
    connect(btn_zoom_out,SIGNAL(clicked()),this,SLOT(on_btn_zoom_out_clicked()));
    //放大按钮
    connect(btn_zoom_in,SIGNAL(clicked()),this,SLOT(on_btn_zoom_in_clicked()));

缩放按钮功能实现

到此为止PDF阅读功能基本完成,余下缩放按钮功能实现。缩放按钮功能实现代码如下:

const qreal zoomMultiplier = qSqrt(2.0);//全局常量

void Widget::on_btn_zoom_in_clicked()
{
    pdfview->setZoomFactor(pdfview->zoomFactor() * zoomMultiplier);
}

void Widget::on_btn_zoom_out_clicked()
{
    pdfview->setZoomFactor(pdfview->zoomFactor() / zoomMultiplier);
}

效果图如下: image.png