Qt中QGridLayout使用方法

QGridLayout 类在网格中布置小部件。
QGridLayout 获取可用的空间(通过其父布局或 parentWidget()),将其划分为行和列,并将其管理的每个小部件放入正确的单元格中。
列和行的行为相同;我们将讨论列,但行也有等价的函数。
每列都有一个最小宽度和一个拉伸因子。最小宽度是使用 setColumnMinimumWidth() 设置的最大宽度和该列中每个小部件的最小宽度。拉伸因子使用 setColumnStretch() 设置,并确定列将获得多少可用空间超过其必要的最小值。
通常,使用 addWidget() 将每个托管小部件或布局放入其自己的单元格中。小部件也可以使用 addItem() 和 addWidget() 的行和列跨越重载来占据多个单元格。如果这样做, QGridLayout 将猜测如何在列/行上分配大小(基于拉伸因子)。
要从布局中删除小部件,请调用 removeWidget()。在小部件上调用 QWidget::hide() 也会有效地从布局中删除小部件,直到调用 QWidget::show()。

源码:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QGridLayout>
#include <QString>
#include <QPushButton>
#include <QLabel>
#include <QDebug>
#include <QLineEdit>
#include <QCheckBox>

class Widget : public QWidget
{
    Q_OBJECT
    
    QPushButton m_btn1;
    QPushButton m_btn2;
    
protected slots:
    void OnClicked1();
    void OnClicked2();
public:
    QString  FetchString(const char* s);
    Widget(QWidget *parent = nullptr);
    ~Widget();
};
#endif // WIDGET_H
#include "Widget.h"
#include <QVBoxLayout>
#include <QGridLayout>
#include <QMessageBox>
#include <QPixmap>

Widget::Widget(QWidget *parent) : QWidget(parent, Qt::WindowFlags()|Qt::WindowCloseButtonHint)
{
    m_btn1.setText(FetchString("方法:"));
    m_btn2.setText(FetchString("项目"));
    
    QVBoxLayout* vLayout = new QVBoxLayout();
    
    vLayout->addWidget(&m_btn1);
    vLayout->addWidget(&m_btn2);
    
    connect(&m_btn1, SIGNAL(clicked()), this, SLOT(OnClicked1()));
    connect(&m_btn2, SIGNAL(clicked()), this, SLOT(OnClicked2()));
    setLayout(vLayout);
    
    setFixedSize(320, 80);
}

void Widget::OnClicked1()
{
    QDialog dia(this);
    QGridLayout* gLayout = new QGridLayout();
    
    QPushButton* pButton1 = new QPushButton(FetchString("One"));
    QPushButton* pButton2 = new QPushButton(FetchString("Two"));
    QPushButton* pButton3 = new QPushButton(FetchString("Three"));
    QPushButton* pButton4 = new QPushButton(FetchString("Four"));
    QPushButton* pButton5 = new QPushButton(FetchString("Five"));
    QPushButton* pButton6 = new QPushButton(FetchString("Six1"));
    QPushButton* pButton7 = new QPushButton(FetchString("Seven"));
    
    pButton1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    pButton2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    pButton3->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    pButton4->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    pButton5->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    pButton6->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    pButton7->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    
    gLayout->addWidget(pButton1, 0, 1);
    gLayout->addWidget(pButton2, 1, 0, 2, 1);
    gLayout->addWidget(pButton3, 1, 1);
    gLayout->addWidget(pButton4, 1, 2);
    gLayout->addWidget(pButton5, 2, 1);
    gLayout->addWidget(pButton6, 3, 0, 1, 3);
    gLayout->addWidget(pButton7, 4, 1);
    
    gLayout->setColumnStretch(0, 1);
    gLayout->setColumnStretch(1, 1);
    gLayout->setColumnStretch(2, 2);
    gLayout->setRowStretch(0, 1);
    gLayout->setRowStretch(1, 2);
    gLayout->setRowStretch(2, 2);
    gLayout->setRowStretch(3, 2);
    gLayout->setRowStretch(4, 2);
    
    dia.setLayout(gLayout);
    dia.exec();
}

void Widget::OnClicked2()
{
    QDialog dia(this);
    QGridLayout* gLayout = new QGridLayout();
    
    QLineEdit* Useredit = new QLineEdit();
    QLineEdit* PassWdedit = new QLineEdit();
    QCheckBox* check1 = new QCheckBox(FetchString("记住密码"));
    QCheckBox* check2 = new QCheckBox(FetchString("自动登录"));
    QPushButton* pBtn = new QPushButton(FetchString("登录"));
    QPushButton* btn1 = new QPushButton(FetchString("申请账号"));
    QPushButton* btn2 = new QPushButton(FetchString("找回密码"));
    
    QPixmap pix("D:/Project/Sample/Sample007/Label.ico");
    QLabel* label = new QLabel(FetchString("测试"));
    label->setPixmap(pix);
    label->setScaledContents(true);
    
    Useredit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    Useredit->setPlaceholderText(FetchString("账号:"));
    PassWdedit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    PassWdedit->setPlaceholderText(FetchString("密码:"));
    
    btn1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    btn1->setStyleSheet("border:none");
    btn1->setFlat(true);
    btn2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    btn2->setStyleSheet("border:none");
    btn2->setFlat(true);
    
    
    gLayout->addWidget(label, 0, 0, 3, 1);
    gLayout->addWidget(Useredit, 0, 1, 1, 3);
    gLayout->addWidget(PassWdedit, 1, 1, 1, 3);
    gLayout->addWidget(btn1, 0, 5);
    gLayout->addWidget(btn2, 1, 5);
    gLayout->addWidget(check1, 2, 1);
    gLayout->addWidget(check2, 2, 3);
    gLayout->addWidget(pBtn, 3, 1, 1, 3);
    
    dia.setLayout(gLayout);
    dia.setFixedSize(300, 130);
    dia.exec();
}

QString Widget::FetchString(const char* s)
{
    return QString::fromLocal8Bit(s);
}

Widget::~Widget()
{
}

运行效果如下:

<think>好的,我现在需要回答用户关于QtQGridLayout的LayoutSizeConstraint属性的问题。首先,我得回忆一下自己对这个属性的了解,或者查阅相关文档来确保准确性。 我记得Qt中的布局管理器有不同的属性来控制布局的行为,特别是当窗口大小变化时。QGridLayout是常用的网格布局,而LayoutSizeConstraint应该是用来设置布局的约束条件,比如固定大小或者跟随内容调整。不过具体的枚举值可能记不太清楚,需要确认。 首先,我应该确认LayoutSizeConstraint在QGridLayout中的作用。可能的作用是控制布局的最小或最大尺寸,或者调整布局在父部件中的行为。例如,设置布局是否根据内容调整大小,或者保持某个固定尺寸。 接下来,我需要查找Qt官方文档中关于QGridLayout的LayoutSizeConstraint属性的说明。根据记忆,QLayout类有一个setSizeConstraint方法,而QGridLayout作为其子类,应该也继承了这个方法。可能这个属性属于QLayout::SizeConstraint枚举类型,用于指定布局的尺寸约束策略。 然后,枚举类型的可能值包括: 1. SetDefaultConstraint:默认行为,可能由布局内容决定。 2. SetNoConstraint:无约束,布局可以自由调整。 3. SetMinimumSize:布局的最小尺寸设置为计算的最小尺寸,不能更小。 4. SetFixedSize:布局尺寸固定为计算的最小尺寸,无法调整。 5. SetMaximumSize:布局的最大尺寸被限制,不能超过某个值。 6. SetMinAndMaxSize:同时设置最小和最大尺寸。 每个值的具体作用需要详细解释,比如SetFixedSize会让布局的大小固定,不会随父窗口调整而改变,而SetMinimumSize则允许布局扩大但不能缩小到低于最小值。这些约束会影响布局内的部件如何排列和调整。 然后,我需要考虑用户可能的应用场景。例如,当用户希望网格布局始终保持最小尺寸时,可以使用SetMinimumSize;或者当布局需要固定大小时,使用SetFixedSize。同时,可能需要给出示例代码片段,展示如何设置这个属性,比如在代码中使用gridLayout->setSizeConstraint(QLayout::SetFixedSize);。 另外,需要注意Qt中布局管理器通常会自动调整,但通过设置不同的约束,可以覆盖默认行为。例如,在需要保持对话框布局固定,不允许用户调整窗口大小时,SetFixedSize会很有用。 最后,要确保回答结构清晰,分点解释每个枚举值的作用,并给出使用建议,帮助用户理解如何根据需求选择合适的约束条件。</think>Qt的`QGridLayout`的`LayoutSizeConstraint`属性用于控制布局本身的尺寸调整策略。该属性继承自`QLayout`类,属于`QLayout::SizeConstraint`枚举类型。以下是分步说明: --- ### 1. **作用说明** 该属性决定了布局管理器如何调整自身的最小/最大尺寸,**直接影响父窗口的缩放行为**。通过设置不同约束条件,可控制: - 布局是否随子部件内容变化 - 父窗口是否允许调整到特定尺寸范围 --- ### 2. **可选枚举值** 通过`setSizeConstraint(QLayout::SizeConstraint)`方法设置,可选值如下: #### ① `SetDefaultConstraint` - **默认行为**,布局的最小尺寸由`minimumSize()`决定,最大尺寸无限制。 - **典型场景**:子部件内容变化时,布局自动调整尺寸。 #### ② `SetFixedSize` - **固定布局尺寸**为`sizeHint()`(即推荐尺寸),**禁止调整**。 - **示例**:确保对话框布局始终固定,用户无法缩放窗口: ```cpp gridLayout->setSizeConstraint(QLayout::SetFixedSize); ``` #### ③ `SetMinimumSize` - 布局的最小尺寸设为`minimumSize()`,但允许扩大。 - **典型场景**:防止布局过小导致内容重叠。 #### ④ `SetMaximumSize` - 布局的最大尺寸设为`maximumSize()`,但允许缩小。 - **注意**:需通过`setMaximumSize()`显式设置最大值。 #### ⑤ `SetMinAndMaxSize` - 同时限制布局的最小和最大尺寸。 - **代码示例**: ```cpp gridLayout->setMinimumSize(200, 100); gridLayout->setMaximumSize(800, 600); gridLayout->setSizeConstraint(QLayout::SetMinAndMaxSize); ``` #### ⑥ `SetNoConstraint` - **完全无约束**,布局尺寸完全由父窗口决定。 - **风险**:可能导致子部件过度压缩或拉伸。 --- ### 3. **使用建议** - **优先依赖默认行为**(`SetDefaultConstraint`),除非有明确需求 - **固定尺寸场景**:如工具面板,使用`SetFixedSize` - **响应式布局**:结合`SetMinAndMaxSize`控制窗口缩放范围 --- ### 4. **注意事项** - 约束作用于**布局本身**,需确保父窗口的尺寸策略与之匹配 - 部分约束需配合`setMinimumSize()`/`setMaximumSize()`使用 - 调试时可通过`qDebug() << layout()->sizeHint();`查看尺寸参数 通过合理选择约束策略,可实现更精细的UI布局控制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值