【自制软件】PDF学习宝-开发日记5--页面跳转

492 阅读2分钟

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


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


页面跳转

前言

前面书库页面和题库页面都是QStackView的子页面,QStackedWidget类提供了一组页面,其中每次只有一个页面可见,这个组件有点像轮播图。添加按钮可以控制其页面跳转,本节使用的方法就是先放置一个测试按钮来控制QStackView子页面由页面1跳转至页面2。

新建测试按钮

这里我在页面1新建一个按钮来模拟在书库中选择并打开图书的操作。点击按钮之后,由页面1跳转至页面2,并在页面2中显示PDF导航栏和文档。

在widget.h头文件中添加声明和槽函数声明:

private slots:
    void on_open_pdf_clicked();         //设置打开pdf响应

private:
    QPushButton *open_pdf;              //打开pdf按钮

在widget.cpp源文件中定义槽函数:

void Widget::on_open_pdf_clicked()
{
    QUrl toOpen = QFileDialog::getOpenFileUrl(this, tr("Choose a PDF"), QUrl(), "Portable Documents (*.pdf)");
    if (toOpen.isValid())
        open(toOpen);
}

在构造函数中添加信号与槽的链接:

connect(open_pdf,SIGNAL(clicked()),this,SLOT(on_open_pdf_clicked()));

在构造函数中实例化按钮并添加到布局中:

    /*书库区域暂时没有完成设计,先添加一个pdf打开按钮*/
    open_pdf = new QPushButton;
    open_pdf->setFixedSize(135,240);
    open_pdf->setText("打开PDF");
    scra->setWidget(open_pdf);

至此,按钮的添加已经完成,接下来需要实现的是pdf文档的加载与由页面1到页面2的跳转,pdf文档加载完成后才会跳转,否则弹出错误提示框。

PDF文档加载

使用Qt PDF模块之前,需要在.pro文件中添加如下语句:

QT += pdf

并且在widget.h头文件中添加:

#include <QtPdf>
#include <QPdfView>

class QPdfDocument;
class QPdfView;


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

private:
    QPdfDocument *m_document;           //pdf文件

改造widget.cpp源文件的构造函数,将构造函数由:

Widget::Widget(QWidget *parent)
    : QWidget(parent)

改为:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , m_document(new QPdfDocument(this))

修改完构造函数后,Qt PDF模块就可以进行使用了,否则会造成软件崩溃。

实现open函数:

void Widget::open(const QUrl &docLocation)
{
    if (docLocation.isLocalFile()) {
        m_document->load(docLocation.toLocalFile());
        const auto documentTitle = m_document->metaData(QPdfDocument::Title).toString();
        if(!documentTitle.isEmpty())
            lab_title->setText("Learning assistant "+documentTitle);//将pdf文档名添加到标题栏文字
        stackview->setCurrentWidget(page2);//页面跳转
    } else {
        QMessageBox::critical(this, tr("Failed to open"), tr("%1 is not a valid local file").arg(docLocation.toString()));
    }
}

我将页面跳转的功能放到了pdf文档打开的函数中,这样做只是暂时的,先将PDF的功能完全开发好之后,后面规划好书库页面后肯定这里也会进行调整。边做边想,有了更好的想法会一直对软件进行优化升级。