【自制软件】PDF学习宝-开发日记4--布局

233 阅读3分钟

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


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


画竹之人,心中有竹

前言

在创建工程时我选择了不勾选Generate form,这意味着就不能使用拖拉拽的方式来创建页面、放置控件和进行布局了。

但是这并不影响什么,俗话说“画竹之人,心中有竹”。我的脑子里已经有了PDF学习宝的大概轮廓,只要照着目标去做,把握好方向即可。 image.png

布局

在Qt中最常用的布局就是这三个:

Qt类描述示例
QVBoxLayout垂直排列image.png
QHBoxLayout水平排列image.png
QGridLayout栅格布局image.png

在使用时需要在头文件中引入以下三个类:

#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>

这三种布局方式一般在使用中搭配起来使用,先用垂直排列或水平排列将小部件进行排列,再将垂直排列或水平排列放在栅格布局中,最后将栅格布局应用到Widget上。

主页面布局

主页面的部件主要有标题栏和QStackView。

标题栏布局

标题栏的布局选用水平排列布局,依次将标题文字、设置、最小化、最大化和关闭按钮进行排列:

    //新建水平布局管理器-标题文字、按钮布局
    QHBoxLayout *layout1 = new QHBoxLayout;
    //设置、最小化、最大化、关闭按钮水平排列
    layout1->addWidget(lab_title);          //将title文字添加到布局中
    layout1->addWidget(btn_setting);        //将设置按钮添加到布局中
    layout1->addWidget(btn_min);            //将最小化按钮添加到布局中
    layout1->addWidget(btn_max);            //将最大化按钮添加到布局中
    layout1->addWidget(btn_close);          //将关闭按钮添加到布局中
    layout1->setSpacing(6);                 //间隔6px
    layout1->setContentsMargins(0,0,0,0);   //左上右下边框设置为0

stackview布局

将stackview放置在垂直排列布局中:

    //新建垂直布局管理器-stackview布局
    QHBoxLayout *layout2 = new QHBoxLayout;
    //stackview
    stackview = new QStackedWidget;
    stackview->resize(winrect.width(),winrect.height());
    //设置排列
    layout2->addWidget(stackview);

总体布局

将标题栏布局和stackview布局放入栅格布局中,将栅格布局设置为总体布局。

    //新建水平布局管理器-lay1、lay2布局
    QGridLayout *layout3 = new QGridLayout;
    layout3->addLayout(layout1,0,0);
    layout3->addLayout(layout2,1,0);
    layout3->setContentsMargins(6,0,6,6);   //左上右下边框设置为0
    setLayout(layout3);

书库/题库页面布局

将stackview的页面1选为书库/题库页面,其布局中暂时包括书库侧边和图书展示窗口:

    //页面1布局
    QHBoxLayout *lay1 = new QHBoxLayout;
    //书库侧边
    lab_side = new QLabel;
    lab_side->resize(winrect.width()/8,winrect.height());
    lab_side->setText("My Books");
    //书库区域
    scra = new QScrollArea;
    scra->resize(winrect.width(),winrect.height());
    //设置排列
    lay1->addWidget(lab_side);
    lay1->addWidget(scra);
    //页面1排列
    page1 = new QWidget;
    page1->setLayout(lay1);
    stackview->addWidget(page1);

下图是原始程序页面图,目前尚未进行美化: image.png

PDF浏览/题库页面

将stackview的页面2选为PDF浏览/题库页面,其中布局包括PDF导航栏、PDF阅读栏和题库编辑/显示栏:

    //页面2布局
    QHBoxLayout *lay2 = new QHBoxLayout;
    //导航栏
    navpdf = new QTreeView;
    navpdf->setMaximumWidth(winrect.width()/8);
    //pdf显示区域
    pdfview = new QPdfView;
    pdfview->resize(stackview->width()/8*5,stackview->height());
    //题库编辑与显示区域
    scra_q = new QScrollArea;
    scra_q->setMaximumWidth(winrect.width()/8*2);
    //设置排列
    lay2->addWidget(navpdf);
    lay2->addWidget(pdfview);
    lay2->addWidget(scra_q);
    //页面2排列
    page2 = new QWidget;
    page2->setLayout(lay2);
    stackview->addWidget(page2);

下图是原始程序页面图,目前尚未进行美化: image.png