QT布局一共有四种,罕用的三种,QHBoxLayout,QVBoxLayout,QGridLayout,在开发过程中,经常会碰到须要布局嵌套的状况,如果这样写

QVBoxLayout *m_layout = new QVBoxLayout(this);QHBoxLayout *m_hlayout1 = new QHBoxLayout(this);QHBoxLayout *m_hlayout2 = new QHBoxLayout(this);m_layout->addLayout(m_hlayout1);m_layout->addLayout(m_hlayout2);

QT会报正告:

那么这个时候它会采纳哪个布局呢?最初增加的那个?不是的,它会都不采纳,应用零碎默认的布局。

那怎么实现嵌套布局呢?
1.应用QWidget过渡

QVBoxLayout *m_layout = new QVBoxLayout(this);QWidget *m_widget1 = new QWidget(this);QHBoxLayout *m_hlayout1 = new QHBoxLayout(m_widget1);QWidget *m_widget2 = new QWidget(this);QHBoxLayout *m_hlayout2 = new QHBoxLayout(m_widget2);m_layout->addWidget(m_widget1);m_layout->addWidget(m_widget2);

2.间接应用,结构里不传this进去(是否会内存透露?不会,addlayout会帮它治理好它的生命周期)

QVBoxLayout *m_layout = new QVBoxLayout(this);QHBoxLayout *m_hlayout1 = new QHBoxLayout();QHBoxLayout *m_hlayout2 = new QHBoxLayout();m_layout->addLayout(m_hlayout1);m_layout->addLayout(m_hlayout2);

测试代码与执行后果:

//hlayout.h#ifndef HLAYOUT_H#define HLAYOUT_H#include <QHBoxLayout>class HLayout : public QHBoxLayout {  public:    HLayout(QWidget* parent = nullptr);    ~HLayout();};#endif  // HLAYOUT_H//hlayout.cpp#include "hlayout.h"#include <QDebug>HLayout::HLayout(QWidget* parent) : QHBoxLayout(parent) { qDebug() << "HLayout"; }HLayout::~HLayout() { qDebug() << "~HLayout"; }//vlayout.h#ifndef VLAYOUT_H#define VLAYOUT_H#include <QVBoxLayout>class VLayout : public QVBoxLayout {  public:    VLayout(QWidget* parent = nullptr);    ~VLayout();};#endif  // VLAYOUT_H//vlayout.cpp#include "vlayout.h"#include <QDebug>VLayout::VLayout(QWidget* parent) : QVBoxLayout(parent) { qDebug() << "VLayout"; }VLayout::~VLayout() { qDebug() << "~VLayout"; }//test.h#ifndef TEST_H#define TEST_H#include <QPushButton>class Test : public QPushButton {  public:    Test(QWidget* parent = nullptr);    ~Test();};#endif  // TEST_H//test.cpp#include "test.h"#include <QDebug>Test::Test(QWidget* parent) : QPushButton(parent) { qDebug() << "Test"; }Test::~Test() { qDebug() << "~Test"; }//mainwindow.h#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include "hlayout.h"#include "test.h"#include "vlayout.h"QT_BEGIN_NAMESPACEnamespace Ui {    class MainWindow;}QT_END_NAMESPACEclass MainWindow : public QMainWindow {    Q_OBJECT  public:    MainWindow(QWidget* parent = nullptr);    ~MainWindow();  private:    Ui::MainWindow* ui;    Test* m_test;    Test* m_test1;    VLayout* m_layout;    HLayout* m_layout1;    HLayout* m_layout2;};#endif  // MAINWINDOW_H//mainwindow.cpp#include "mainwindow.h"#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow) {    ui->setupUi(this);    m_test = new Test(this->centralWidget());    m_test->setText("test");    m_test1 = new Test(this->centralWidget());    m_test1->setText("test1");    m_layout = new VLayout(this->centralWidget());    m_layout1 = new HLayout;    m_layout2 = new HLayout;    m_layout1->addWidget(m_test);    m_layout2->addWidget(m_test1);    m_layout->addLayout(m_layout1);    m_layout->addLayout(m_layout2);}MainWindow::~MainWindow() { delete ui; }//main.cpp#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]){    QApplication a(argc, argv);    MainWindow w;    w.show();    return a.exec();}