QT常见布局器使用

布局简介

为什么要布局?通过布局拖动不影响鼠标拖动窗口的效果等优点.QT设计器布局比较固定,不方便后期修改和维护;在Qt里面布局分为四个大类 :

盒子布局:QBoxLayout

网格布局:QGridLayout

表单布局: QFormLayout

抽屉布局: QStackedLayout

QBoxLayout

一般使用它的两个子类QHBoxLayout 和 QVBoxLayout 负责水平和垂直布局

垂直布局示例:

cpp 复制代码
#include "mainwindow.h"
#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QWidget* w=new QWidget;
    setCentralWidget(w);//注意MainWindow不能直接进行布局

    QVBoxLayout* vlayout=new QVBoxLayout;
    QPushButton* b1=new QPushButton("b1");
    QPushButton* b2=new QPushButton("b2");
    QPushButton* b3=new QPushButton("b3");

    vlayout->addWidget(b1);
    vlayout->addStretch(1);//增加一个伸缩量
    vlayout->addWidget(b2);
    vlayout->addStretch(1);//增加一个伸缩量
    vlayout->addWidget(b3);
    vlayout->addStretch(2);//增加一个伸缩量

    centralWidget()->setLayout(vlayout);
    this->resize(300, 300);
}

水平布局示例:

cpp 复制代码
#include "mainwindow.h"
#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setWindowTitle("水平布局");
    QWidget* w=new QWidget;
    setCentralWidget(w);

    QHBoxLayout* hlayout=new QHBoxLayout;
    QPushButton* b1=new QPushButton("b1");
    QPushButton* b2=new QPushButton("b2");
    QPushButton* b3=new QPushButton("b3");

    hlayout->addWidget(b1);
    hlayout->addStretch(1);//增加一个伸缩量
    hlayout->addWidget(b2);
    hlayout->addStretch(1);//增加一个伸缩量
    hlayout->addWidget(b3);
    hlayout->addStretch(2);//增加一个伸缩量

    centralWidget()->setLayout(hlayout);
    this->resize(300, 300);
}

水平布局和垂直布局综合(可以结合QGroupBox容器进行布局):

cpp 复制代码
#include "mainwindow.h"
#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGroupBox>
#include <QRadioButton>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setWindowTitle("垂直布局");
    QWidget* w=new QWidget;
    setCentralWidget(w);

    QVBoxLayout* container=new QVBoxLayout;

    QGroupBox *hobby_box = new QGroupBox("爱好");
    QVBoxLayout* v_layout=new QVBoxLayout;
    QRadioButton* btn1 = new QRadioButton("抽烟");
    QRadioButton* btn2 = new QRadioButton("喝酒");
    QRadioButton* btn3 = new QRadioButton("玩乐");
    v_layout->addWidget(btn1);
    v_layout->addWidget(btn2);
    v_layout->addWidget(btn3);
    hobby_box->setLayout(v_layout);

    QGroupBox* gender_box = new QGroupBox("性别");
    QHBoxLayout* h_layout = new QHBoxLayout();
    QRadioButton* btn4 =  new QRadioButton("男");
    QRadioButton* btn5 = new QRadioButton("女");
    h_layout->addWidget(btn4);
    h_layout->addWidget(btn5);
    gender_box->setLayout(h_layout);

    container->addWidget(hobby_box);
    container->addWidget(gender_box);

    centralWidget()->setLayout(container);
    this->resize(300, 300);
}

++++QGridLayout++++

网格布局,有的人称之为九宫格布局;示例如下:

cpp 复制代码
#include "mainwindow.h"
#include <QApplication>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGroupBox>
#include <QRadioButton>
#include <QStringList>
#include <QLineEdit>
#include <QGridLayout>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setWindowTitle("网格布局");
    QWidget* w=new QWidget;
    setCentralWidget(w);

    QVBoxLayout* container=new QVBoxLayout;

    QPushButton* m_buttons[20];
    const char* btnText[20] =
    {
        "7", "8", "9", "+", "(",
        "4", "5", "6", "-", ")",
        "1", "2", "3", "*", "<-",
        "0", ".", "=", "/", "C"
    };

    QLineEdit* edit = new QLineEdit();
    edit->setPlaceholderText("请输入内容");

    QGridLayout* grid = new QGridLayout();

    int line_number = 0;
    int col_number = 0;
    for(line_number = 0;line_number < 4;line_number++){
         // 此时line_number是第几行
        for(col_number = 0;col_number < 5;col_number++){
            // 此时col_number是第几列
            m_buttons[line_number*5 + col_number] = new QPushButton();
            m_buttons[line_number*5 + col_number]->setText(btnText[line_number*5 + col_number]);
            grid->addWidget(m_buttons[line_number*5 + col_number], line_number, col_number);
        }
    }
    container->addWidget(edit);
    container->addLayout(grid);

    centralWidget()->setLayout(container);
    this->resize(300, 300);
}

QFormLayout

一般适用于提交数据form表单 。比如: 登录,注册类似的场景

++++QStackedLayout++++

提供了多页面切换的布局,一次只能看到一个界面。 抽屉布局

相关推荐
泡海椒8 分钟前
JQuick-Excel 实战:用 VALIDATION 建立可维护的 Excel 导入校验
开发语言·python·excel
longlongzihan12 分钟前
前缀积与后缀积 —— LeetCode 238. 除了自身以外数组的乘积
开发语言·c++·leetcode
szial25 分钟前
JavaScript 的 call、apply 和 bind:如何控制函数调用
开发语言·前端·javascript
weixin_3077791327 分钟前
C++代码实现MATLAB中的cvpartition函数功能
开发语言·c++·算法·matlab
黑妹天下第一乖36 分钟前
小智改造实战解读-首 token 延迟去哪了:云端与端侧大模型的分段对照
开发语言·人工智能·python·嵌入式硬件·自然语言处理·iot
。小二37 分钟前
Go 泛型并发利刃:async 库深度评测——370K ops/s、零依赖、生产就绪
开发语言·javascript·golang
(Charon)41 分钟前
【C++面试】线程同步机制:互斥锁、条件变量、原子操作与读写锁
开发语言·c++·算法·面试
CV工程师丁Sir1 小时前
ArkWeb 手记 06|window.open 与页面跳转拦截
开发语言·php·harmonyos
夜不会漫长1 小时前
C++:内存管理
java·开发语言·c++
徐小黑ACG1 小时前
Golang 基础01
开发语言·后端·golang