Qt 布局操作记录
布局类型
QVBoxLayout *vLayout = new QVBoxLayout(); // 垂直布局
QHBoxLayout *hLayout = new QHBoxLayout(); // 水平布局
QGridLayout *gridLayout = new QGridLayout(); // 网格布局
垂直布局将控件垂直排列,水平布局将控件水平排列,网格布局将控件按网格排列。
设置布局
- 在创建布局时设置
QVBoxLayout *mainLayout = new QVBoxLayout(this);
上面的代码表示创建了一个垂直布局(指针对象) mainLayout,而且将当前对象 this 的布局设置为 mainLayout 。
2. 使用setLayout()函数设置
widget->setLayout(layout);
上述代码通过调用setLayout()函数将widget布局设置为layout。
添加控件到布局
mainLayout->addWidget(button1);
mainLayout->addWidget(button2);
使用addWdiget函数可以将控件添加到指定布局中,上述代码添加了两个按钮控件到布局 mainLayout 中,这两个按钮将会垂直排列显示。
父对象的改变
布局对父对象的改变:
(1)将控件添加到布局之前,如果该控件已经被设置了父对象,那么布局不会改变其父对象。
(2)当我们使用layout->addWidget(widget)时,如果该widget还没有父对象,则布局会将其父对象设置为该布局所属的widget。
布局嵌套
一个布局可以嵌套另一个布局。
HBoxLayout *subLayout = new HBoxLayout(subWidget);
mainLayout->addLayout(subLayout);
上述代码表示水平布局subLayout嵌套在垂直布局mainLayout中。
重复设置布局的问题
QVBoxLayout *mainLayout = new QVBoxLayout(this);
QHBoxLayout *titleLayout = new QHBoxLayout(this);
上面的代码会报以下问题
QLayout: Attempting to add QLayout "" to MainWindow "", which already has a layout
因为,当前对象 this 已经设置了布局后,我们尝试再次对其设置布局会出现重复设置的提示。
QWidget 与 QLayout 的关系
QWidget 是一个容器,可以包含其它可视的控件。
QLayout是一个布局,用于对容器中的子控件的排列进行管理。

浙公网安备 33010602011771号