Qt 布局

布局管理系统:

QLayout类是布局管理器的基类,是一个抽象基类,继承自QObject、QLayoutItem,QLayoutItem类提供了一个供QLayout操作的抽象项目。

常用的布局有四种:

Vertical Layout      (QVBoxLayout)垂直布局
Horizontal Layout  (QHBoxLayout)水平布局
Grid Layout              (QGridLayout)网格布局
From Layout             (QFormLayout)表单布局

布局中常用的方法:

setColumnStretch()

设定列的占用比例
addStretch()添加一个占位符,使按钮的大小不会变化
setSizeConstraint()设定最优化显示,用户无法改变对话框大小
setDirection()可以设定布局的排列顺序
setSpaceing()设置部件间距
setContentMargins()设置外边距

垂直布局:

垂直布局,让布局里面的控件按照竖直方式排列

格式:

  1.  创建垂直布局   QVBoxLayout *VB=new QVBoxLayout;
  2.  布局中添加控件  VB->addWidget()
  3.  窗口中添加布局  Widget->setLayout(VB);
    QWidget *widget=new QWidget();//添加一个窗口
    widget->resize(500,500);//设置窗口大小
    QPushButton *push1=new QPushButton("1",widget);
    QPushButton *push2=new QPushButton("2",widget);
    QPushButton *push3=new QPushButton("3",widget);
    QPushButton *push4=new QPushButton("4",widget);
    QPushButton *push5=new QPushButton("5",widget);
    QVBoxLayout *hlay=new QVBoxLayout;//创建垂直布局
    hlay->addWidget(push1);//添加控件
    hlay->addWidget(push2);
    hlay->addWidget(push3);
    hlay->addWidget(push4);
    hlay->addWidget(push5);
    widget->setLayout(hlay);//窗口中添加布局
    widget->show();

水平布局:

水平布局,让布局里面的控件按照水平方式排列

格式:

  1.  创建水平布局   QVBoxLayout *HB=new QVBoxLayout;
  2.  布局中添加       HB->addWidget()
  3.  窗口中添加布局  Widget->setLayout(HB);
    QWidget *widget=new QWidget();//添加一个窗口
    widget->resize(500,500);//设置窗口大小
    QPushButton *push1=new QPushButton("1",widget);
    QPushButton *push2=new QPushButton("2",widget);
    QPushButton *push3=new QPushButton("3",widget);
    QPushButton *push4=new QPushButton("4",widget);
    QPushButton *push5=new QPushButton("5",widget);
    QHBoxLayout *hlay=new QHBoxLayout;//创建水平布局
    hlay->addWidget(push1);//添加控件
    hlay->addWidget(push2);
    hlay->addWidget(push3);
    hlay->addWidget(push4);
    hlay->addWidget(push5);
    widget->setLayout(hlay);//窗口中添加布局
    widget->show();//显示窗口

 网格布局:

QGridLayout 占用提供给它的空间,将其划分为行和列,并将其管理的每个小部件放入正确的单元格中。

创建布局:

1.QGridLayout()

2.QGridLayout(QWidget *parent)设置父类  也可以通过 1  用  窗口->setLayout()来设置

打破布局:

~QGridLayout()

设置部件之间的间距

水平间距:setHorizontalSpacing(int spacing)

垂直间距:setVerticalSpacing(int spacing)

间距:setSpacing(int spacing)

设置外间距:QLayout::setContentsMargins(int left, int top, int right, int bottom)

添加控件:

 void QGridLayout::addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment = Qt::Alignment())

将 widget 控件添加到网格中的 (row,column) 位置处,并且可以自定义该控件的对齐方式。

void QGridLayout::addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())

将 widget 控件从 (fromRow, fromColumn) 位置开始,跨 rowSpan 行和 ColumnSpan 列添加到网格中,并且可以自定义该控件的对齐方式。

添加布局: 

void QGridLayout::addLayout(QLayout *layout, int row, int column, Qt::Alignment alignment = Qt::Alignment())

向网格中的 (row, column) 位置处添加 layout 布局管理器。
 void QGridLayout::addLayout(QLayout *layout, int row, int column, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())
将 layout 布局管理器从  (row, column) 位置开始,跨 rowSpan 行和 ColumnSpan 列添加到网格中,并且可以自定义该布局控件的对齐方式。

 其他成员方法:

rowCount()获取网格控件中的行数
columnCount() 获取网格控件中的列数
setColumnStretch(int column, int stretch)给指定的 column 列设置伸缩系数
setRowStretch(int row, int stretch)给指定的 row 行设置伸缩系数。
setColumnMinimumWidth(int column, int minSize)设置 column 列的最小宽度。
setRowMinimumHeight(int row, int minSize)设置 row 行的最小宽度。

登录窗口:

    QWidget *widget=new QWidget();
    widget->resize(500,500);
    QPushButton *p1=new QPushButton("登录",widget);
    QPushButton *p2=new QPushButton("退出",widget);
    QPushButton *p3=new QPushButton("注册账号",widget);
    QPushButton *p4=new QPushButton("找回密码",widget);
    QLabel *lab1=new QLabel("账号:",widget);
    QLabel *lab2=new QLabel("密码:",widget);
    QLineEdit *Lind1=new QLineEdit(widget);
    QLineEdit *Lind2=new QLineEdit(widget);
    //创建一个布局
    QGridLayout *qgt=new QGridLayout;
    //设置label大小
    lab1->resize(40,20);
    lab2->resize(40,20);

    qgt->addWidget(lab1,0,0,1,1);//  账号:     第0行第0列 开始,占用1行1列
    qgt->addWidget(Lind1,0,1,1,3);// 账号输入框 第0行第1列 开始,占用1行3列
    qgt->addWidget(p3,0,5,1,1);//    注册账号   第0行第5列 开始,占用1行1列

    qgt->addWidget(lab2,1,0,1,1);  //密码: 第1行第0列 开始, 占用1行1列
    qgt->addWidget(Lind2,1,1,1,3);// 账号输入框 第1行第1列 开始,占用1行3列
    qgt->addWidget(p4,1,5,1,1);    //找回密码   第1行第5列 开始,占用1行1列
    //设置密码显示格式
    Lind1->setEchoMode(QLineEdit::Password);

    qgt->addWidget(p1,3,1); //登录  第3行第1列 开始, 占用1行1列
    qgt->addWidget(p2,3,3); //退出  第3行第3列 开始, 占用1行1列
    qgt->setHorizontalSpacing(10);//设置水平间距
    qgt->setVerticalSpacing(10);//设置垂直间距
    qgt->setContentsMargins(100,100,100,100);//设置外边距

    widget->setLayout(qgt);
    widget->show();

表单布局:

QFormLayout 只包含 2 列,且第一列通常放置第二列控件的标签

创建表单布局:

1.QFormLayout()

2.QFormLayout(父类)

添加表单:

1.

QFormLayout::addRow(QWidget *label, QWidget *field)

    将一个新行添加到此窗体布局的底部,其中包含给定的标签字段

addRow(const QString &labelText, QWidget *field)

   后台创建一个 QLabel,并将 labelText 作为其文本。该字段被设置为新的 QLabel 的伙伴

   将指定的 field 控件和 labelText 描述信息添加到表单控件的末尾。

addRow(const QString &labelText, QLayout *field)

   可以在表单中添加布局

设置标签和字段的位置 :

setRowWrapPolicy(QFormLayout::RowWrapPolicy policy

QFormLayout::DontWrapRows字段始终位于其标签旁边。这是除 Qt 扩展样式之外的所有样式的默认策略。
QFormLayout::WrapLongRows为标注提供足够的水平空间以适合最宽的标注,其余空间则分配给字段。如果字段对的最小大小大于可用空间,则该字段将换行到下一行。这是 Qt 扩展样式的默认策略。
QFormLayout::WrapAllRows字段始终位于其标签下方。
QFormLayout::insertRow(int row, const QString &labelText, QWidget *field)将指定的 field 控件和 labelText 描述信息插入到表单控件中指定行的位置。

QFormLayout::removeRow(int row)

如果要从布局中删除行而不删除小部件,请改用 takeRow()

删除表单控件中的指定行。
QFormLayout::removeRow(QWidget *widget)删除表单控件中 widget 控件所在的行。

 设置间距:

水平间距:setHorizontalSpacing(int spacing)

垂直间距:setVerticalSpacing(int spacing)

间距:setSpacing(int spacing)

设置外间距:QLayout::setContentsMargins(int left, int top, int right, int bottom)

其他成员函数:

QLayoutItem *QFormLayout::itemAt(int row, QFormLayout::ItemRole role) const

返回给定中具有指定角色(列)的布局项。如果没有此类项目,则返回。nullptr
    QFormLayout *qft=new QFormLayout;//添加布局
    QLineEdit *line1=new QLineEdit(widget);//设置两个LineEdit
    QLineEdit *line2=new QLineEdit(widget);
    qft->addRow("账号:",line1);
    qft->addRow("密码;",line2);
    widget->setLayout(qft);
    QPushButton *p1=new QPushButton("登录",widget);
    QPushButton *p2=new QPushButton("退出",widget);
    qft->addRow(p1,p2);
    qft->setVerticalSpacing(50);//设置垂直间距
    qft->setContentsMargins(100,100,100,100);//设置外间距

设置部件大小:

  •  sizeHint 保存了部件的建议大小(不同部件不同)
  • minimumSizeHint 保存了一个建议的最小大小提示
sizeHint()获取sizeHint的值
minimumSizeHint()获取minimumSizeHint的值
setMinimumSizeHint()可以修改部件的最小大小,最小大小提示会失效
    QHBoxLayout *layout=new QHBoxLayout(this);
    QLabel *lab1=new QLabel("控件一");
    QLabel *lab2=new QLabel("控件二");
    layout->addWidget(lab1);
    layout->addWidget(lab2);
    qDebug()<<lab1->sizeHint();//建议的值
    qDebug()<<lab1->minimumSizeHint();//建议的最小大小

 

 QSizePolicy(大小策略)

使用函数setSizePolicy()设置

QSizePolicy::Fixed只能使用sizeHint()提供的大小
QSizePolicy::MinimumsizeHint()提供的大小是最小的,部件可以被拉伸
QSizePolicy::MaximumsizeHint()提供的大小是最大的,部件可以被拉伸
QSizePolicy::PreferredsizeHint()提供的大小是最佳大小,部件可以被压缩或拉伸
QSizePolicy::ExpandingsizeHint()提供的大小是合适大小,可以被压缩,但倾向于被拉伸
QSizePolicy::MinimumExpandingsizeHint()提供的大小是最小的,部件倾向于被拉伸
QSizePolicy::IgnoredsizeHint()提供的大小被忽略,部件尽可能拉伸获得空间

在ui界面中:

 stretch factor(伸缩因子)

伸缩因子的作用:用来设置部件比例。

使用函数:setStrechFactor()来设置伸缩因子

可扩展窗口:

一个窗口可能有很多选项是扩充的,只有在必要时才显现出来,这样就可以使用一个按钮来隐藏或者显示多余的内容。

setVisible(bool) 可以使控件隐藏

例子:在界面中

把Widget放到页面中并添加两个按钮并水平布局

然后添加一个垂直布局,在里面放入Widget和一个textEdit

 在构造函数中实现功能:

    ui->textEdit->setVisible(false);//默认为隐藏
    connect(ui->pushButton,&QPushButton::clicked,[=]()
    {
        ui->textEdit->setVisible(true);
    });
    connect(ui->pushButton_2,&QPushButton::clicked,[=]()
    {
        ui->textEdit->setVisible(false);
    });

默认为隐藏:

 点击显示后:

点击隐藏后:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值