一点一滴成长

导航

《QT Creator快速入门》第四章:布局管理

 QLayout是布局管理器基类,我们一般使用其派生类QBoxLayout(基本布局管理器)、QGridLayout(栅格布局管理器)、QFormLayout(表单布局管理器)、QStackedLayout(栈布局管理器)。

1、QBoxLayout(基本布局管理器)下又有垂直布局管理器QVBoxLayout和水平布局管理器QHBoxLayout,垂直布局管理器使其所有的部件都按照垂直方式排列,水平布局管理器使其所有的部件都按照水平方式来排列。

  在设计模式下我们可以通过“右键->布局”或者工具栏上来选择添加指定类型的布局管理器,比如我们向Widget添加一个字体选择控件和一个文本编辑控件后,再添加一个垂直布局管理器后效果如下图所示,拉伸窗口的话上面两个控件大小也会随之改变。通过上面的方法向Widget添加垂直布局管理器实际上是在ui设计类中添加了以下代码:

 

  将布局管理器添加到窗口上后,这个布局管理器和其上面的部件都会成为窗口的子部件,我们可以使用childern()方法来获取一个部件的所有子部件列表(QObjectList *类型)。

  也可以添加一个水平布局管理器QHBoxLayout,其效果如下:

  

  我们也可以在Widget的构造函数中自己实现垂直布局管理器的代码:

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);


    QVBoxLayout* layout = new QVBoxLayout; //新建垂直布局管理器
    layout->addWidget(ui->fontComboBox); //通过addWidget向布局管理器添加部件
    layout->insertWidget(1, ui->textEdit); //通过insertWidget向布局管理器添加部件
    layout->setContentsMargins(20, 40, 20, 40); //设置布局管理器到边界的距离,依次为左右上下
    layout->setSpacing(10); //设置布局管理器中各个子部件间距

    setLayout(layout); //设置为当前Widget的布局,布局管理器和其部件成为当前Widget的子部件
}

  上面我们在设计模式下下的Widget窗口上通过“右键-布局”或选择工具栏上的布局项来添加的是顶级布局管理器,我们也可以像添加子控件一样选择一个布局管理器拖动到Widget上,然后在这个布局管理器里添加子控件,这样添加的是普通的布局管理器。 

  右键Widget部件可以看到添加的垂直布局管理器的属性设置(对于不是顶级布局管理器直接右键布局管理器查看属性),其含义如下所示:

  其中的layoutStretch伸缩因子属性是用来设置部件间的比例的,比如对于一个有两个部件的垂直布局管理器,我们将其layoutStretch设置为1,2的话则第二个部件的高度是第一个的两倍,也可以通过向布局管理器添加部件的addWidget()方法的第二个参数来设置

伸缩因子。

  还有一个layoutSizeConstraint属性用来约束窗口大小,它只对顶级布局管理器有用,它的几个值含义如下:

 

  我们也可以向一个widge插入多个布局管理器(通过设计模式下拖拽布局管理器部件或代码实现都可以),如下为一个垂直布局管理器和一个水平布局管理器:

   向一个Widget插入一个布局管理器后实际上会新增一个Widget部件,如下的代码是在设计模式下向一个Widget窗口插入一个垂直布局管理器后,再向垂直布局管理器插入三个pushButton后ui类自动生成的代码:

 

   也可以将一个布局管理器放入另一个布局管理器之中,在代码里可以通过父布局管理器的addLayout()方法。

2、QGridLayout(栅格布局管理器)可以使部件按照行和列来布局而不是像垂直布局管理器或水平布局管理器那样所有部件只能呈一列或一行来显示,以下是代码示例和效果:

 

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    QGridLayout* layout = new QGridLayout;
    layout->addWidget(ui->fontComboBox, 0, 0, 1, 2); //添加部件,从0行0列开始,占据1行2列
    layout->addWidget(ui->pushButton, 0, 2, 1, 1); //添加部件,从0行2列开始,占据一行1列
    layout->addWidget(ui->textEdit, 1, 0, 1, 3); //添加部件,从1行0列开始,占据1行3列

    setLayout(layout);
}

 3、QFormLayout(表单布局管理器)适用于有多个输入控件(lineEditor、comboBox等),并且每个输入控件都有一个对应的Label说明标签的情况(如下图所示),使用表单布局管理器可以很方便的设置输入控件的快捷键。我们在设计模式下向widget拖入一个Form Layout,然后双击它或右键选择”添加窗体布局行“来添加一个Label和输入控件,在输入标签文本的时候我们加上(&N)就为对应的控件设置了加速键,比如设置标签名称为”姓名(&N)“,则程序运行时,输入alt+n则相当于点击了姓名对应的输入栏。在代码里我们可以使用addRow方法来向表单布局管理器添加表单行。

  

  可以看到在布局管理器中的部件默认是不能进行自定义的移动或拉伸的,我们可以使用一个QSpacerItem来设置部件之间的间隔。如下图所示,我们分别在一个表单布局管理器和一个水平布局管理器中添加了Vertical Spacer和Horizontal Spacer,程序运行的时候这两个分隔符是不显示的:

   

 上面通过设计模式下添加的分隔符对应生成的实现代码如下:

  表单布局管理器的属性比基本布局管理器的属性增加了几项,如下所示:

  

4、QWidget的sizePolicy(大小策略)属性用来设置部件的默认布局行为,其值如下所示:

 通过以上可知,QWidget部件的sizeHint()和minimumSizeHint()会影响布局管理器的布局,sizeHint()方法获取的是sizeHint,它是部件的建议大小,minimumSizeHint()方法获取的是minimumSizeHint,它是部件的建议最小大小,不过如果使用minimumSize()方法设置了部件的最小大小,那么minimumSizeHint属性会被忽略。

  可以看到sizePolicy的水平伸展因子和垂直伸展因子默认都为0,比如现在有一个水平布局管理器,其上有两个pushButton,我们将其中一个的sizePolicy的水平伸展因子设置为1,将另一个的水平伸展因子设置为2的话,可以看到当我们拉伸水平布局管理器的时候当按钮长度超过sizeHint的时候一个按钮的长度始终是另一个的2倍。

  比如对于前面我们使用的垂直分隔符,我们将其sizeHint属性的高度设置为100,但程序运行的时候分隔符实际上并没有达到100,因为其sizeType属性为expanding,如果将其设置为Fixed的话则分隔符实际高度才会变成100。

  再比如下图中,一个水平布局管理器下原有一个Push Button和一个Tool Button,如果我们再添加一个Radio Button的话可以看到只有Push Button的长度被缩小了,Tool Button的大小没有变化,这其实是因为Push Button的sizePolicy属性的水平策略默认为Minimum,而Push Button的水平策略默认为Fixed。

        

   再比如一个垂直布局管理器我们向它放置3个pushButton后默认效果如下图左部分,我们点击其属性可以看到虽然上边距和下边距及部件间的间距都为0,但效果其实不是这样,因为pushButton的sizePolicy属性的垂直策略是Fixed,我们将其修改为Minimum后效果如下图的右部分:

  

  QSizePolicy对象可以用来设置部件的sizePolicy属性,通过部件的setSizePolicy()方法,如下为ui设计类里为Widget窗口生成的sizePolicy属性设置代码:

  

5、QSplitter类对象是分裂器部件,它类似于基本布局管理器QBoxLayout,不同的是放在分裂器的部件可以随着分裂器大小的改变而改变大小,比如在QBoxLayout的按钮的垂直方向默认是不会被拉伸的,但是放到分裂器里就可以。分裂器与基本布局管理器另一点不同的是QSplitter继承自QFrame,QBoxLayout则继承自QObject,所以我们还可以设置分裂器的边框显示效果。在设计模式下添加分裂器的方法是:选择要添加到分裂器的部件然后“右键-布局-使用分裂器垂直/水平布局”,或者在工具栏上选择“使用分裂器垂直/水平布局”。

6、设置伙伴和Tab键顺序

   前面的表单布局管理器中自动给我们设置了标签对应的伙伴部件,这样输入指定的加速键就可以切换到对应的伙伴部件上,我们也可以自己指定标签的伙伴,方法是在设计模式下选择工具栏上的“编辑伙伴”模式,选择标签然后拖动到指定的部件上,然后输入f4进入普通模式,将标签的文本中添加“&快捷键字母”,比如标签文本设置成"labelText&l"的话对应部件的加速键就是alt+l。如果要在代码中设置标签的伙伴可以使用QLabel的setBuddy()方法。

   在设计模式中选择工具栏上的“编辑Tab顺序”模式可以对部件的Tab顺序进行设置,也可以在代码中使用setTabOrder()方法来对部件的Tab顺序进行设置。

7、定位器

   在Qt Creator的左下角有一个搜索定位器,输入ctrl+k可以看到它的一些用法,比如输入". "可以看到当前文档里的C++类、类对象、类方法,输入"l 10"可以定位到当前文档的第10行,输入“? qpushbutton”可以转到QPushButton类的帮助文档,输入"p "可以看到当前项目中的所有文件。

  

posted on 2020-09-03 15:15  整鬼专家  阅读(1493)  评论(0编辑  收藏  举报