【自制软件】PDF学习宝-开发日记9--对话框与主界面间的通信

236 阅读2分钟

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


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


对话框与主界面间的通信

前言

上一节创建了CreateBook对话框,对话框的主要功能是获取PDF位置与PDF名称。获取信息完成后,对话框需要将这些信息传递给主界面。因为对话框是模态的,完成信息传递之后对话框需要退出主界面才能继续使用。

本节使用信号与槽将CreateBook对话框与主界面进行连接,在CreateBook类中定义发射信息的信号,在主界面中创建连接处理接收到的信号中的信息并保存。

CreateBook类

在createbook.h中添加信号,一个信号将PDF文档的本地URL发送出去,另一个信号是将PDF文档的名字发送出去。

signals:
    void snedUrl(QUrl to);                  //将选择的PDF文档的URL发送给主界面
    void snedBookName(QString to);          //将选择的PDF文档的名字发送给主界面

在createbook.cpp中实现按钮功能:

  • 打开PDF按钮,选择PDF文档获取PDF文档的本地URL,将其发射出去。
  • 确认按钮。将输入的名称发射出去并关闭对话框
  • 取消按钮。直接关闭对话框
void CreateBook::on_btn_createBook_clicked()
{
    QUrl toOpen = QFileDialog::getOpenFileUrl(this, tr("Choose a PDF"),
                                              QUrl(), "Portable Documents (*.pdf)");
    if(!toOpen.isEmpty())
        pdf_flag = true;

    emit snedUrl(toOpen);
}

void CreateBook::on_btn_apply_clicked()
{
    if(!book_name->text().isEmpty() && pdf_flag == true)
        emit snedBookName(book_name->text());
    this->close();
}

void CreateBook::on_btn_cancel_clicked()
{
    this->close();
}

主界面

在widget.h头文件中添加如下代码:

#include "createbook.h"

private slots:
    void getURL(QUrl urlOpen);          //接收CreateBook对话框发送来的PDF位置
    void getBookName(QString bookname); //接收CreateBook对话框发送来的PDF名字

    QUrl urlOpen;                       //pdf文档所在位置
    QString bookname;                   //PDF名字

    CreateBook *create_book;            //创建图书对话框

在widget.cpp源文件的构造函数中添加对话框界面与主界面之间的连接:

    //CreateBook对话框槽函数
    create_book = new CreateBook;
    connect(create_book,SIGNAL(snedUrl(QUrl)),this,SLOT(getURL(QUrl)));
    connect(create_book,SIGNAL(snedBookName(QString)),this,SLOT(getBookName(QString)));
  • 改造打开PDF按钮函数,如果已经创建过一次,则直接打开图书,否则进行打开对话框进行创建
  • 实现接收URL函数
  • 实现接收名称函数
void Widget::on_open_pdf_clicked()
{
    if(urlOpen.isValid() && !bookname.isEmpty())
    {
        open(urlOpen);
        stackview->setCurrentWidget(page2);//页面跳转
    }
    else
    {
        create_book->setWindowTitle("创建图书");
        create_book->exec();
    }
}

void Widget::getURL(QUrl toOpen)
{
    urlOpen = toOpen;
}

void Widget::getBookName(QString name)
{
    bookname = name;
    if (urlOpen.isValid())
    {
        open(urlOpen);
        stackview->setCurrentWidget(page2);//页面跳转
    }
}