持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情
📒博客首页:何名取 的个人主页 - 文章 - 掘金 (juejin.cn)
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
❤️期待一起交流!
🙏作者水平很有限,如果发现错误,求告知,多谢!
🌺有问题可私信交流!!!
书库页实现一
前言
上一节讲到了书库页的设计,需要用到Qt的模型视图来进行数据的显示,加上代理后可以进行一些操作。本节先来进行调整书库页的布局,将设计中用到的一些控件添加到界面上去。再将CreateBook对话框与数据库进行连接,之前是对话框与主界面进行连接。然后读取数据库中存储的PDF电子书信息表在书库中创建图书项。
调整布局
在widget.h中创建所需控件:
QPushButton *btn_create_pdf; //创建pdf按钮
QPushButton *btn_insert_pdf; //插入pdf按钮
QPushButton *btn_delete_pdf; //删除pdf按钮
QPushButton *btn_modify_pdf; //修改pdf按钮
QListView *books_view; //书库列表视图
在widget.cpp的构造函数中进行排列:
//书库管理排列:创建、插入、删除和修改图书
QHBoxLayout *lay_books_manage = new QHBoxLayout;
//创建图书
btn_create_pdf = new QPushButton;
btn_create_pdf->setMinimumSize(100,40);
btn_create_pdf->setText("创建图书");
//删除图书
btn_delete_pdf = new QPushButton;
btn_delete_pdf->setMinimumSize(100,40);
btn_delete_pdf->setText("删除图书");
//插入图书
btn_insert_pdf = new QPushButton;
btn_insert_pdf->setMinimumSize(100,40);
btn_insert_pdf->setText("插入图书");
//修改图书
btn_modify_pdf = new QPushButton;
btn_modify_pdf->setMinimumSize(100,40);
btn_modify_pdf->setText("修改图书");
//布局排列
lay_books_manage->addWidget(btn_create_pdf);
lay_books_manage->addWidget(btn_delete_pdf);
lay_books_manage->addWidget(btn_insert_pdf);
lay_books_manage->addWidget(btn_modify_pdf);
lay_books_manage->addStretch();
//scra布局
QVBoxLayout *lay_books = new QVBoxLayout;
//QListView图书视图
books_view = new QListView;
//排列布局
lay_books->addLayout(lay_books_manage);
lay_books->addWidget(books_view);
scra->setLayout(lay_books);
目前的界面效果:
逻辑部分
交互逻辑部分主要有:
- 创建图书时,点击创建图书按钮后弹出CreateBook对话框,对话框获取到PDF电子书的位置与书名后由之前的传递给主界面改为由对话框获取信息传递给主界面,再由主界面传递到数据库的PDF电子书信息表中存储
- 删除图书,将数据库的PDF电子书信息表中的相应条目删去
- 插入图书,在目标图书项之前插入新建图书
- 修改图书,将目标图书项的所在位置或书名信息进行修改 这几项分别对应了数据库的增删改,查询在每次操作后都会触发。
将createbook.h中的信号改为:
signals:
void snedBooks(QString to,QString pos); //将创建图书信息发送给数据库
修改createbook.cpp中的按钮:
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;
pdf_pos = toOpen.toString();
}
void CreateBook::on_btn_apply_clicked()
{
if(!book_name->text().isEmpty() && pdf_flag == true)
emit snedBooks(book_name->text(),pdf_pos);
this->close();
}
修改widget.h中的接收槽函数:
private slots:
void getBooks(QString name,QString pos); //接收创建图书信息
修改widget.cpp中构造函数和对应的接收槽函数实现:
connect(create_book,SIGNAL(snedBooks(QString,QString)),this,SLOT(getBooks(QString,QString)));
void Widget::getBooks(QString name,QString pos)
{
database->book_table_insert(name,pos);
}