Qt专栏:http://t.csdnimg.cn/GQN1M
目录
1.现象1
2.解决方案
3.现象2
4.解决方案
5.总结
1.现象1
今天在用QGridLayout布局的时候,添加到布局的QWidget有文本框、标签、组合框和按钮等等,布局两列,通过下面的方式添加进去的:
QGridLayout* pGridLayout = new QGridLayout(this);
QLabel* pLabel1 = new QLabel("1111111", this);
pGridLayout->addWidget(pLabel1, 0, 0, Qt::AlignLeft);
QLineEdit* pEdit1 = new QLineEdit(this);
pGridLayout->addWidget(pEdit, 0, 1, Qt::AlignLeft);
发现在窗口拉伸的时候,pEdit 不会填满第0行1列的位置,右边有空隙。
2.解决方案
最初还以为是pGridLayout 的margin所致,发现setContentsMargins也没有用;于是仔细查看Qt的官方文档:
翻译一下就是:
将给定的小部件添加到行、列的单元格网格中。默认情况下,左上角的位置为(0,0)。对齐方式由参数alignment指定。默认对齐方式为0,这意味着小部件将填充整个单元格。
恍然大悟,不能设置QGridLayout的对齐方式,就是addWiget的最后一个参数不能填写,于是改为:
pGridLayout->addWidget(pEdit, 0, 1);
拖动窗口改变大小,pEdit可以填满整个窗口了。
3.现象2
同样在上面的基础上,又增加一个QComboBox,代码如下图所示:
QLabel* pLabel2 = new QLabel("2222222", this);
pGridLayout->addWidget(pLabel2, 1, 0, Qt::AlignLeft);
QComboBox* pComboBox = new QComboBox(this);
pGridLayout->addWidget(pComboBox, 1, 1);
发现在窗口拉伸的时候,pComboBox 不会填满第1行1列的位置,左边有空隙。
4.解决方案
联想到是不是pComboBox本身自己没有填满窗口,于是查看资料,找到QWidget设置改变窗口大小函数setSizePolicy,函数定义为:
void QWidget::setSizePolicy(QSizePolicy::Policy horizontal, QSizePolicy::Policy vertical)
QSizePolicy的介绍为:
解释为:
QSizePolicy::Policy。策略。描述了构造QSizePolicy时使用的各种尺寸调整类型。
Fixed:size固定为QWidget::sizeHint()。
Minimum:size不能小于 sizeHint() 提供的大小。
Maximum:size不能大于 sizeHint() 提供的大小。
Preferred:最佳size为 sizeHint()。
Expanding:sizeHint()为推荐的size,但尽可能地获得更大的空间。
MinimumExpanding:sizeHint()是最小的size,但尽可能地获得更大的空间。
Ignored:sizeHint()被忽略。小部件将获得尽可能多的空间。
于是代码修改为:
QLabel* pLabel2 = new QLabel("2222222", this);
pGridLayout->addWidget(pLabel2, 1, 0, Qt::AlignLeft);
QComboBox* pComboBox = new QComboBox(this);
pComboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
pGridLayout->addWidget(pComboBox, 1, 1);
拖动窗口改变大小,pComboBox可以填满整个窗口了。
5.总结
使用QGridLayout可以轻松创建灵活的网格布局,适用于多种类型的界面。它提供了方便和强大的方式来管理和调整子部件的位置和大小,并且支持灵活的行和列布局控制。遇到问题,除了大还要仔细阅读QT的官方文档之外,还需要大胆的发散性思维,假设求证。只有这样才能提高我们的编码水平。