chapter6 布局管理

Chapter6 布局管理

布局管理应该说是GUI当中很重要的一个方面.毕竟窗体程序是要展示的,既然要展示,就展现的美丽大方,各个部件摆放合理,而不应该令用户感到杂乱.Qt在这方面,提供了一整套的工具,比句布局管理器,如QHBoxLayout, QVBoxLayout, QGridLayout等等,方便我们构建合理的布局.

提到布局,大致有三种方式:

1.绝对位置法
2.人工布局法
3.布局管理器法.

前面的两种方式,不仅需要一个个的计算每个窗体部件的位置和大小,这很费功夫,而且用户无法改变窗体的大小,比较呆板,做不到自响应,故而在实际中很少采纳.目前而言,基本都是采用第三种方式,即利用Qt自带的布局管理器,布局管理器很自动的为不同类型的窗体部件分配合理的空间,而且当整个窗体的布局大小发生改变时,也会自动的伸缩和扩展,使用起来很方便.

构造窗体,可以采用纯代码的方式,也可以利用Qt Designer,二者结合当然也是可以的.

finddialog.h

#ifndef FINDFILEDIALOG_H
#define FINDFILEDIALOG_H

#include <QDialog>
#include "ui_findfiledialog.h"

class QGridLayout;
class QHBoxLayout;
class QVBoxLayout;
class FindFileDialog : public QDialog, public Ui::FindFileDialog{
    Q_OBJECT

public:
    FindFileDialog(QWidget *parent = 0);

private:
    QGridLayout *leftLayout;
    QVBoxLayout *rightLayout;
    QHBoxLayout *mainLayout;
};

#endif

窗体部件利用Qt Designer摆放好,然后在代码中给它们加上布局管理器.

findfile.cpp

#include <QtWidgets>
#include "findfiledialog.h"

FindFileDialog::FindFileDialog(QWidget *parent) : QDialog(parent){
    setupUi(this);
    
    leftLayout = new QGridLayout;
    leftLayout->addWidget(namedLabel, 0, 0);
    leftLayout->addWidget(namedLineEdit, 0, 1);
    leftLayout->addWidget(lookInLabel, 1, 0);
    leftLayout->addWidget(lookInLineEdit, 1, 1);
    leftLayout->addWidget(subfoldersCheckBox, 2, 0, 1, 2);
    leftLayout->addWidget(tableWidget, 3, 0, 1, 2);
    leftLayout->addWidget(messageLabel, 4, 0, 1, 2);

    rightLayout = new QVBoxLayout;
    rightLayout->addWidget(findButton);
    rightLayout->addWidget(stopButton);
    rightLayout->addWidget(closeButton);
    rightLayout->addStretch();
    rightLayout->addWidget(helpButton);

    mainLayout = new QHBoxLayout;
    mainLayout->addLayout(leftLayout);
    mainLayout->addLayout(rightLayout);
    setLayout(mainLayout);
    setWindowTitle(tr("Find Files or Folders")); 
}

QGridLayout会比较复杂一些,几个参数分别表示:行,列,行的伸展,列的伸展.

以上代码可以看出,布局管理器是可以多层嵌套的,从最小的窗体部件开始,逐渐的一层层给它们添加布局管理器,最后调用setLayout()函数,将最顶层的布局管理器传入,即可.

除了上面的三个布局管理器,还有一些,比如说:分组布局里经常使用到的QStackedLayout,还有一种把更多布局选择交给用户的切分窗口QSplitter,或者滚动区域QScrollArea,不过就使用频率而言,不如上面的三个.

总结:最近的博客写的比较简单,只说最核心的,当然了,深入进去自然也是相当复杂的,这些,要等到以后学的逐步深入才会了解到的,这本书"C++ GUI Qt4",写的还是不错的,但是有些例子,的确是复杂了一些,打算先把基础的部分过一遍,然后再慢慢的实现.

posted @ 2017-11-05 15:44  plantree  阅读(136)  评论(0编辑  收藏  举报