持续创作,加速成长!这是我参与「掘金日新计划 · 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);//页面跳转
}
}