持续创作,加速成长!这是我参与「掘金日新计划 · 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布局做一下修改,将这些功能所需的控件添加到布局中。控件与布局如下图所示:
这些控件采用水平排列布局,然后再与之前的布局一起添加到垂直排列布局中,之后在页面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);
}
效果图如下: