前端开发
439
通过API设置布局
在QT中, 布局也有对应的类, 布局类之间的关系如下:
在上图中的布局类虽然很多, 常用的布局类有三个, 就前边给大家介绍的三种布局, 对应关系如下:
布局样式 | 类名 |
---|---|
水平布局 | QHBoxLayout |
垂直布局 | QVBoxLayout |
网格(栅格)布局 | QGridLayout |
一般我们不使用这些布局类对窗口进行布局 但还是在这里介绍一下这些类中常用的一些API函数
1. QLayout
// 在布局最后面添加一个窗口 void QLayout::addWidget(QWidget *w); // 将某个窗口对象从布局中移除, 窗口对象如果不再使用需要自己析构 void QLayout::removeWidget(QWidget *widget); // 设置布局的四个边界大小, 即: 左、上、右和下的边距。 void QLayout::setContentsMargins(int left, int top, int right, int bottom); // 设置布局中各个窗口之间的间隙大小 void setSpacing(int);
2. QHBoxLayout
这个类中的常用API都是从基类继承过来的
// 创建符窗口对象 QWidget *window = new QWidget; // 创建若干个子窗口对象 QPushButton *button1 = new QPushButton("One"); QPushButton *button2 = new QPushButton("Two"); QPushButton *button3 = new QPushButton("Three"); QPushButton *button4 = new QPushButton("Four"); QPushButton *button5 = new QPushButton("Five"); // 创建水平布局对象 QHBoxLayout *layout = new QHBoxLayout; // 将子窗口添加到布局中 layout->addWidget(button1); layout->addWidget(button2); layout->addWidget(button3); layout->addWidget(button4); layout->addWidget(button5); // 将水平布局设置给父窗口对象 window->setLayout(layout); // 显示父窗口 window->show();
代码效果展示:
3.QVBoxLayout
这个类中的常用API都是从基类继承过来的
// 创建符窗口对象 QWidget *window = new QWidget; // 创建若干个子窗口对象 QPushButton *button1 = new QPushButton("One"); QPushButton *button2 = new QPushButton("Two"); QPushButton *button3 = new QPushButton("Three"); QPushButton *button4 = new QPushButton("Four"); QPushButton *button5 = new QPushButton("Five"); // 创建垂直布局对象 QVBoxLayout *layout = new QVBoxLayout; // 将子窗口添加到布局中 layout->addWidget(button1); layout->addWidget(button2); layout->addWidget(button3); layout->addWidget(button4); layout->addWidget(button5); // 将水平布局设置给父窗口对象 window->setLayout(layout); // 显示父窗口 window->show();
代码效果展示:
4. QGridLayout
// 构造函数 QGridLayout::QGridLayout(); QGridLayout::QGridLayout(QWidget *parent); // 添加窗口对象到网格布局中 /* 参数: - widget: 添加到布局中的窗口对象 - row: 添加到布局中的窗口对象位于第几行 (从0开始) - column: 添加到布局中的窗口对象位于第几列 (从0开始) - alignment: 窗口在布局中的对齐方式, 没有特殊需求使用默认值即可 */ void QGridLayout::addWidget( QWidget *widget, int row, int column, Qt::Alignment alignment = Qt::Alignment()); /* 参数: - widget: 添加到布局中的窗口对象 - fromRow: 添加到布局中的窗口对象位于第几行 (从0开始) - fromColumn: 添加到布局中的窗口对象位于第几列 (从0开始) - rowSpan: 添加的窗口从 fromRow 行开始跨越的行数 - columnSpan: 添加的窗口从 fromColumn 列开始跨越的列数 - alignment: 窗口在布局中的对齐方式, 没有特殊需求使用默认值即可 */ void QGridLayout::addWidget( QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment()); // 设置 column 对应的列的最新宽度, 单位: 像素 void QGridLayout::setColumnMinimumWidth(int column, int minSize); // 设置布局中水平方向窗口之间间隔的宽度 void QGridLayout::setHorizontalSpacing(int spacing); // 设置布局中垂直方向窗口之间间隔的宽度 void QGridLayout::setVerticalSpacing(int spacing);
测试代码如下:
// 创建父窗口对象 QWidget* window = new QWidget; // 创建子窗口对象 QPushButton *button1 = new QPushButton("One"); QPushButton *button2 = new QPushButton("Two"); QPushButton *button3 = new QPushButton("Three"); QPushButton *button4 = new QPushButton("Four"); QPushButton *button5 = new QPushButton("Five"); QPushButton *button6 = new QPushButton("Six"); // 多行文本编辑框 QTextEdit* txedit = new QTextEdit; txedit->setText("我占用了两行两列的空间哦。"); QGridLayout* layout = new QGridLayout; // 按钮起始位置: 第1行, 第1列, 该按钮占用空间情况为1行1列 layout->addWidget(button1, 0, 0); // 按钮起始位置: 第1行, 第2列, 该按钮占用空间情况为1行1列 layout->addWidget(button2, 0, 1); // 按钮起始位置: 第1行, 第3列, 该按钮占用空间情况为1行1列 layout->addWidget(button3, 0, 2); // 编辑框起始位置: 第2行, 第1列, 该按钮占用空间情况为2行2列 layout->addWidget(txedit, 1, 0, 2, 2); // 按钮起始位置: 第2行, 第3列, 该按钮占用空间情况为1行1列 layout->addWidget(button4, 1, 2); // 按钮起始位置: 第3行, 第3列, 该按钮占用空间情况为1行1列 layout->addWidget(button5, 2, 2); // 按钮起始位置: 第4行, 第1列, 该按钮占用空间情况为1行3列 layout->addWidget(button6, 3, 0, 1, 3); // 网格布局设置给父窗口对象 window->setLayout(layout); // 显示父窗口 window->show();
测试代码效果展示: