《七》布局QLayout类

QLayout简介

QLayout是由具体类 QBoxLayoutQGridLayoutQFormLayoutQStackedLayout继承的抽象基类。

对于 QLayout子类或 QMainWindow的用户,很少需要使用 QLayout 提供的基本功能,例如 setSizeConstraint() 或 setMenuBar()。Qt 布局系统提供了一种简单而强大的方法,可以在控件内自动排列子控件,以确保它们充分利用可用空间。Qt 包含一组布局管理类,用于描述控件在应用程序用户界面中的布局方式。 当控件的可用空间发生变化时,这些布局会自动定位和调整控件的大小,确保它们的排列一致并且用户界面作为一个整体仍然可用。

所有 QWidget子类都可以使用布局来管理它们的子类。QWidget::setLayout()函数可以为一个控件布局。 当以这种方式在widget上设置布局时,它负责以下任务:

  • 布置子控件。
  • 最高层窗口可感知的默认大小。
  • 最高层窗口可感知的最小大小。
  • 调整大小的处理。
  • 当内容改变的时候自动更新:
    1. 字体大小、文本或者子控件的其它内容。
    2. 隐藏或者显示子控件。
    3. 移除一些子控件。

Qt的布局类

Qt的布局类使用手写的C++代码设计的,所以很容易理解和使用。

使用Qt Designer创建的界面生成的代码也使用了布局类。涉及用户界面开发时,Qt Designer非常有用,因为它避免了编译、链接、运行这样一个循环。

水平、垂直、网格、表单布局

为控件提供良好布局的最简单方法是使用内置布局管理器:QHBoxLayoutQVBoxLayoutQGridLayoutQFormLayout。这些类从QLayout 继承,而 QLayout又从 QObject(而不是QWidget)派生。他们负责一组控件的几何管理。 要创建更复杂的布局,可以将布局管理器相互嵌套。

QHBoxLayout:从左到右在水平行中布置控件。

QVBoxLayout: 在垂直列中从上到下布置控件。

QGridLayout :在二维网格中布置控件。 控件可以占用多个单元格。

 QFormLayout:把控件按照标签-输入框的形式排列在两列。

使用布局提示

当使用布局的时候,构建子控件的时候不需要指定parent,布局将会自动的指定parent(使用QWidget::setParent()),使它们成为安装了该布局的界面的子控件。

布局中常用的方法有 addWidget()addLayout().

我们来代码演示一下实现一个这样的布局:

//在头文件中定义和引用所需
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include<QLineEdit>
#include<QComboBox>
#include<QTextEdit>
#include<qpushbutton.h>
#include<QLabel>
#include<QGridLayout>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();

private:
    //左边
    //网格布局QGridLayout
    QGridLayout *layout;
    QLabel *UserNumber;//员工编号
    QLineEdit *UserNumberEdit;
    QLabel *UserName;//员工姓名
    QLineEdit *UserNameEdit;
    QLabel *UserSex;//性别
    QComboBox *UserSexCombox;
    QLabel *UserDepart;//部门
    QTextEdit *UserDepartEdit;
    QLabel *UserAge;//年龄
    QLineEdit *UserAgeEdit;

    //右边,网格布局QGridLayout
    QHBoxLayout* TopRightLayout;
    QVBoxLayout* RightLayout;
    QLabel* MyselfInfo;
    QTextEdit *myselfInfoTextEdit;

    //右边底部
    QPushButton *okbtn,*cancelbtn;
    QHBoxLayout *buttonLayout;
};
#endif // DIALOG_H

在源文件开始实现:

    setWindowTitle("员工信息");//标题
    //左边控件----实例化
    UserNumber=new QLabel("员工编号");
    UserNumberEdit=new QLineEdit;

    UserName=new QLabel("员工姓名");
    UserNameEdit=new QLineEdit;

    UserAge=new QLabel("员工年龄");
    UserAgeEdit=new QLineEdit;

    UserSex=new QLabel("员工性别");
    UserSexCombox=new QComboBox;
    UserSexCombox->addItem("男");
    UserSexCombox->addItem("女");

    UserDepart=new QLabel("员工部门");
    UserDepartEdit=new QTextEdit;

实例化出这些控件之后我们在网格布局中去添加就好了:

//左边网格布局
    layout =new QGridLayout();
    layout->addWidget(UserNumber,0,0);
    layout->addWidget(UserNumberEdit,0,1);

    layout->addWidget(UserName,1,0);
    layout->addWidget(UserNameEdit,1,1);

    layout->addWidget(UserSex,2,0);
    layout->addWidget(UserSexCombox,2,1);

    layout->addWidget(UserAge,3,0);
    layout->addWidget(UserAgeEdit,3,1);

    layout->addWidget(UserDepart,4,0);
    layout->addWidget(UserDepartEdit,4,1);

//整体
    QGridLayout *mlayout=new QGridLayout(this);
    mlayout->addLayout(layout,0,0);

像这样,我们把剩下的去实例化,去布局就可以了:

    //右边shang控件
    TopRightLayout=new QHBoxLayout();
    MyselfInfo=new QLabel("个人简历");
    myselfInfoTextEdit=new QTextEdit;


    RightLayout=new QVBoxLayout();
    RightLayout->addLayout(TopRightLayout);
    RightLayout->addWidget(MyselfInfo);
    RightLayout->addWidget(myselfInfoTextEdit);
    //右边下部分
    okbtn=new QPushButton("确认");
    cancelbtn=new QPushButton("取消");

    buttonLayout=new QHBoxLayout();
    buttonLayout->addStretch();
    buttonLayout->addWidget(okbtn);
    buttonLayout->addWidget(cancelbtn);

    layout->setColumnStretch(0,1);
    layout->setColumnStretch(1,3);

    QGridLayout *mlayout=new QGridLayout(this);
    mlayout->addLayout(layout,0,0);
    mlayout->addLayout(RightLayout,0,1);
    mlayout->addLayout(buttonLayout,1,0,1,2);

这样就大功告成了

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值