Qt中布局管理使用总结

2023-11-12

目录

1. 五大布局

1.1 QVBoxLayout垂直布局

1.2 QHBoxLayout水平布局

1.3 QGridLayout网格布局

1.4 QFormLayout表单布局

1.5 QStackedLayout分组布局

1.6 五大布局综合应用

2. 分割窗口

3. 滚动区域

4. 停靠区域


1. 五大布局

1.1 QVBoxLayout垂直布局

#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QVBoxLayout>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //MainWindow w;
    //w.show();

    //创建主窗口
    QWidget widget;
    widget.setWindowTitle("QVBoxLayout垂直布局");
    //创建垂直布局管理器
    QVBoxLayout *layout=new QVBoxLayout;
    //设置布局管理器中所有控件从下往上依次排列
    layout->setDirection(QBoxLayout::BottomToTop);

    //连续创建 3 个文本框,并设置它们的背景和字体大小
    QLabel lab1("Label1");
    lab1.setStyleSheet("QLabel{background:#dddddd;font:20px;}");
    lab1.setAlignment(Qt::AlignCenter);
    QLabel lab2("Label2");
    lab2.setStyleSheet("QLabel{background:#cccccc;font:20px;}");
    lab2.setAlignment(Qt::AlignCenter);
    QLabel lab3("Label3");
    lab3.setStyleSheet("QLabel{background:#ffffff;font:20px;}");
    lab3.setAlignment(Qt::AlignCenter);

    //将 3 个文本框和 2 个空白行添加到管理器中,它们的伸缩系数比是 2:1:2:3:3
    layout->addStretch(2);
    layout->addWidget(&lab1,1);
    layout->addWidget(&lab2,2);
    layout->addWidget(&lab3,3);
    layout->addStretch(3);

    //将布局管理器添加到 widget 窗口中
    widget.setLayout(layout);
    widget.show();

    
    return a.exec();
}


1.2 QHBoxLayout水平布局

#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QHBoxLayout>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //创建主窗口
    QWidget widget;
    widget.setWindowTitle("QHBoxLayout水平布局");

    //创建水平布局管理器
    QHBoxLayout *layout=new QHBoxLayout;
    //设置布局管理器中所有控件的布局方向为从右往左依次排列
    layout->setDirection(QBoxLayout::RightToLeft);
    //连续创建 3 个文本框,并设置它们的背景和字体大小
    QLabel lab1("Label1");
    lab1.setStyleSheet("QLabel{background:#dddddd;font:20px;}");
    lab1.setAlignment(Qt::AlignCenter);
    QLabel lab2("Label2");
    lab2.setStyleSheet("QLabel{background:#cccccc;font:20px;}");
    lab2.setAlignment(Qt::AlignCenter);
    QLabel lab3("Label3");
    lab3.setStyleSheet("QLabel{background:#ffffff;font:20px;}");
    lab3.setAlignment(Qt::AlignCenter);

    //将 3 个文本框和 2 个空白列添加到管理器中,它们的拉伸系数比是 2:1:2:3:3
    layout->addStretch(2);
    layout->addWidget(&lab1,1);
    layout->addWidget(&lab2,2);
    layout->addWidget(&lab3,3);
    layout->addStretch(3);

    //将布局管理器添加到 widget 窗口中
    widget.setLayout(layout);
    widget.show();

    return a.exec();
}

1.3 QGridLayout网格布局

#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QGridLayout>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //创建主窗口
    QWidget widget;
    widget.setWindowTitle("QGridLayout网格布局");

    //创建 4 个按钮和 1 个文本框
    QPushButton *but1 = new QPushButton("but1");
    QPushButton *but2 = new QPushButton("but2");
    QLabel *lab3 = new QLabel("lab");
    lab3->setStyleSheet("QLabel{background:#dddddd;font:20px;}");
    lab3->setAlignment(Qt::AlignCenter);
    QPushButton *but3 = new QPushButton("but3");
    QPushButton *but4 = new QPushButton("but4");
    //创建网格布局控件
    QGridLayout *layout = new QGridLayout;

    //向 layout 中添加控件,并指定各个控件的位置
    layout->addWidget(but1, 0, 0);
    layout->addWidget(but2, 0, 2);
    layout->addWidget(lab3, 1, 0, 3, 3); // 从第1行第0列开始占据3行3列
    layout->addWidget(but3, 4, 0);
    layout->addWidget(but4, 4, 2);

    //将 layout 添加到 widget 窗口中
    widget.setLayout(layout);
    widget.show();

    return a.exec();
}

1.4 QFormLayout表单布局

#include <QApplication>
#include <QWidget>
#include <QLineEdit>
#include <QFormLayout>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //创建主窗口
    QWidget widget;
    widget.setWindowTitle("QFormLayout表单布局");

    //创建 4 个按钮和 1 个文本框
    QFormLayout* layout = new QFormLayout();
    //设置表单中的标签都位于控件的上方
    //layout->setRowWrapPolicy(QFormLayout::WrapAllRows);
    //添加 3 行输入框和标签
    layout->addRow("Name:", new QLineEdit());
    layout->addRow("Email:", new QLineEdit());
    layout->addRow("Adress:", new QLineEdit());
    //设置行间距和列间距为 10
    layout->setSpacing(10);
    //将 layout 表单添加到 widget 窗口中
    widget.setLayout(layout);
    widget.show();

    return a.exec();
}

1.5 QStackedLayout分组布局

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QStackedLayout>
#include <QListWidget>
#include <QHBoxLayout>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //创建主窗口
    QWidget widget;
    widget.setWindowTitle("QStackedLayout分组布局");
    widget.resize(600,400);

    //向主窗口中添加一个水平布局控件
    QHBoxLayout *layout=new QHBoxLayout;

    //创建一个列表
    QListWidget listWidget(&widget);
    listWidget.setMinimumWidth(150);
    listWidget.setFont(QFont("宋体", 14));
    listWidget.addItem("QPushButton");
    listWidget.addItem("QLabel");
    listWidget.addItem("QLineEdit");

    //新建 3 个窗口,分别放置文本框、按钮和单行输入框
    QWidget widget1;
    widget1.setMinimumSize(400,400);
    QPushButton but1("这是一个按钮", &widget1);
    QWidget widget2;
    widget2.setMinimumSize(400, 400);
    QLabel lab1("这是一个文本框", &widget2);
    QWidget widget3;
    widget3.setMinimumSize(400,400);
    QLineEdit edit("这是一个单行输入框", &widget3);

    //创建一个分组布局,将 3 个窗口添加到分组控件中
    QStackedLayout *stackedLayout = new QStackedLayout;
    stackedLayout->addWidget(&widget1);
    stackedLayout->addWidget(&widget2);
    stackedLayout->addWidget(&widget3);

    //layout 第一列添加 QListWidget 控件,第二列添加分组布局控件,设置它们的伸缩系数比为 1:4
    layout->addWidget(&listWidget, 1);
    layout->addLayout(stackedLayout, 4);
    //将 layout 水平布局控件添加到 widget 窗口中
    widget.setLayout(layout);
    widget.show();

    //连接信号和槽,实现当点击列表中的某一项,切换分组布局管理器显示的控件
    QObject::connect(&listWidget, &QListWidget::currentRowChanged, stackedLayout, &QStackedLayout::setCurrentIndex);

    return a.exec();
}

1.6 五大布局综合应用

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QWidget>
#include <QMainWindow>
#include <QPushButton>      // 用于创建按钮的类
#include <QHBoxLayout>      // 用于水平布局的类
#include <QTextEdit>        // 用于创建文本框的类
#include <QGridLayout>      // 用于栅格布局的类
#include <QLineEdit>        // 用于创建行文本框的类
#include <QFormLayout>      // 用于表单布局的类
#include <QStackedLayout>   // 用于分页布局的类
#include <QComboBox>        // 用于下拉框的类

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

private:
    QWidget *m_widget;

private:
    //演示表单布局
    QLineEdit   *nameLineEdit;  // 声明 name 文本框
    QLineEdit   *emailLineEdit; // 声明 email 文本框

    //演示水平布局
    QPushButton *button1;       // 声明按钮1
    QPushButton *button2;       // 声明按钮2
    QPushButton *button3;       // 声明按钮3
    QPushButton *button4;       // 声明按钮4
    QPushButton *button5;       // 声明按钮5

    // 演示垂直布局
    QPushButton *button6;       // 声明按钮6
    QPushButton *button7;       // 声明按钮7
    QPushButton *button8;       // 声明按钮8
    QPushButton *button9;       // 声明按钮9
    QPushButton *button10;      // 声明按钮10

    // 演示网格布局
    QPushButton *button11;      // 声明按钮11
    QPushButton *button12;      // 声明按钮12
    QTextEdit   *gridTextEdit;      // 声明文本框

    // 演示分组布局
    QPushButton *button13;      // 声明按钮13
    QPushButton *button14;      // 声明按钮14
    QPushButton *button15;      // 声明按钮15
    QPushButton *button16;      // 声明按钮16
    QPushButton *button17;      // 声明按钮17
    QPushButton *button18;      // 声明按钮18
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

/*
//比较常用的布局微调整接口
QBoxLayout::setSpacing(int spacing);  设置组件之间的间隔,
QBoxLayout::addStretch(int stretch = 0); 设置一个占位空间,
QLayout::setContentsMargins(int left, int top, int right, int bottom); 设置布局管理器到边界的距离。
*/

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 设置后页面大小不可调整,一直处于系统推荐大小的状态
    //this->setFixedSize(sizeHint());

    // 首先创建一个QWidget并设置给QMainWindow,否则布局看不见
    m_widget = new QWidget(this);
    this->setCentralWidget(m_widget);
    // 演示布局管理器到边界的距离 左  上 右 下
    m_widget->setContentsMargins(50, 100, 50, 100);
    // 设置固定大小
    /*
    this->setFixedHeight(400);
    this->setFixedWidth(600);
    */

    // 创建按钮1
    button1 = new QPushButton("One");
    // 创建按钮2
    button2 = new QPushButton("Two");
    // 创建按钮3
    button3 = new QPushButton("Three");
    // 创建按钮4
    button4 = new QPushButton("Four");
    // 创建按钮5
    button5 = new QPushButton("Five");

    // [1]创建水平页面布局管理对象
    QHBoxLayout *hlayout = new QHBoxLayout;
    // 向水平布局增加 按钮1
    hlayout->addWidget(button1);
    // 向水平布局增加 按钮2
    hlayout->addWidget(button2);
    // 向水平布局增加 按钮3
    hlayout->addWidget(button3);
    // 向水平布局增加 按钮4
    hlayout->addWidget(button4);
    // 向水平布局增加 按钮5
    hlayout->addWidget(button5);
    // 设置水平页面布局是窗口布局
    //m_widget->setLayout(hlayout);
    // 演示水平布局之间增加间隔
    hlayout->setSpacing(200);

    // 创建按钮6
    button6 = new QPushButton("Six");
    // 创建按钮7
    button7 = new QPushButton("Seven");
    // 创建按钮8
    button8 = new QPushButton("Eight");
    // 创建按钮9
    button9 = new QPushButton("Nine");
    // 创建按钮10
    button10 = new QPushButton("Ten");

    // [2]创建垂直页面布局管理对象
    QVBoxLayout *vlayout = new QVBoxLayout;
    // 向水平布局增加 按钮6
    vlayout->addWidget(button6);
    // 向水平布局增加 按钮7
    vlayout->addWidget(button7);
    // 演示在按钮之间增加一个占位(弹簧)
    vlayout->addStretch(1);
    // 向水平布局增加 按钮8
    vlayout->addWidget(button8);
    // 向水平布局增加 按钮9
    vlayout->addWidget(button9);
    // 向水平布局增加 按钮10
    vlayout->addWidget(button10);


    // 创建按钮11
    button11 = new QPushButton("Eleven");
    // 创建按钮12
    button12 = new QPushButton("Twelve");
    // 创建文本框
    gridTextEdit = new QTextEdit();

    // [4]创建栅格页面布局管理对象
    QGridLayout *gridLayout = new QGridLayout;
    gridLayout->addWidget(button11,0,0,1,1);
    gridLayout->addWidget(button12,0,1,1,1);
    gridLayout->addWidget(gridTextEdit,2,0,4,2);

   // 创建行文本框
   nameLineEdit = new QLineEdit();
   emailLineEdit = new QLineEdit();

   // [6]创建表单页面布局管理对象
   QFormLayout *formLayout = new QFormLayout;
   formLayout->addRow(tr("&Name:"), nameLineEdit);
   formLayout->addRow(tr("&Email:"), emailLineEdit);


    // [5]创建水平页面布局管理
    QHBoxLayout *gridhlayout = new QHBoxLayout;
    gridhlayout->addLayout(vlayout);
    gridhlayout->addLayout(gridLayout);

    // [3]创建垂直页面布局管理对象
    QVBoxLayout *layout = new QVBoxLayout;
    m_widget->setLayout(layout);

    layout->addLayout(formLayout);
    layout->addLayout(hlayout);
    layout->addLayout(gridhlayout);

    // 分页布局
    // [7.1]第一步:准备3个页面,每个页面放置一些组件
    QWidget *firstPageWidget = new QWidget;
    QWidget *secondPageWidget = new QWidget;
    QWidget *thirdPageWidget = new QWidget;
    // 准备页面组件:创建6个按钮,每个页面放置一个按钮
    button13 = new QPushButton("Page 1 button13");
    button14 = new QPushButton("Page 1 button14");
    button15 = new QPushButton("Page 2 button15");
    button16 = new QPushButton("Page 2 button16");
    button17 = new QPushButton("Page 3 button17");
    button18 = new QPushButton("Page 3 button18");
    // 创建3个页面布局,每个页面一个布局
    QVBoxLayout *page1layout = new QVBoxLayout;
    QHBoxLayout *page2layout = new QHBoxLayout;
    QVBoxLayout *page3layout = new QVBoxLayout;
    // 给分页布局添加组件
    page1layout->addWidget(button13);
    page1layout->addWidget(button14);
    page2layout->addWidget(button15);
    page2layout->addWidget(button16);
    page3layout->addWidget(button17);
    page3layout->addWidget(button18);
    // 设置分页布局
    firstPageWidget->setLayout(page1layout);
    secondPageWidget->setLayout(page2layout);
    thirdPageWidget->setLayout(page3layout);

    // [7.2]第二步:创建 QStackedLayout 页面布局管理对象,把分页添加到这个对象上
    QStackedLayout *stackedLayout = new QStackedLayout;
    // 向分页布局对象添加页面
    stackedLayout->addWidget(firstPageWidget);
    stackedLayout->addWidget(secondPageWidget);
    stackedLayout->addWidget(thirdPageWidget);

    // [7.3]第三步:设置分页切换方法,使用 QComboBox或QListWidget 实现
    QComboBox *pageComboBox = new QComboBox;
    pageComboBox->addItem(tr("Page 1"));
    pageComboBox->addItem(tr("Page 2"));
    pageComboBox->addItem(tr("Page 3"));
    connect(pageComboBox, SIGNAL(activated(int)), stackedLayout, SLOT(setCurrentIndex(int)));

    // [7.4]第四步:将 QStackedLayout 布局添加到主布局上,将分页切换组件添加到一个布局上
    vlayout->addWidget(pageComboBox);
    layout->addLayout(stackedLayout); // 向主页面添加分页布局

}

MainWindow::~MainWindow()
{
    delete ui;
}

main.cpp

#include "mainwindow.h"
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QStackedLayout>
#include <QListWidget>
#include <QHBoxLayout>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);


    MainWindow  wondow;
    wondow.show();


    return a.exec();
}

2. 分割窗口

Qt中提供了 QSplitter 分离器类来实现窗口的分割,分割的窗口是用分割条隔开的,用户可以拖动分割条调整窗口的大小。

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSplitter>
#include <QTextEdit>
#include <QHBoxLayout>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

private:
    QWidget *m_widget;

private:
    QTextEdit *textEdit1;       // 声明文本框1
    QTextEdit *textEdit2;       // 声明文本框2
    QTextEdit *textEdit3;       // 声明文本框3

};

#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_widget = new QWidget(this);
    this->setCentralWidget(m_widget);

    // [1]创建3个文本框
    textEdit1 = new QTextEdit();
    textEdit2 = new QTextEdit();
    textEdit3 = new QTextEdit();

    // [2]创建分离器对象
    QSplitter* splitter = new QSplitter;
    // [3]设置内部组件水平方向布局
    splitter->setOrientation(Qt::Horizontal);
    // [4]向分离器中,添加组件
    splitter->addWidget(textEdit1);
    splitter->addWidget(textEdit2);
    splitter->addWidget(textEdit3);

    /*
     * [5]调整3个分割窗口的显示比例 1:1:2
     * setStretchFactor函数:
     *  第一个参数:窗口索引,从0开始
     *  第二个参数:拉伸比例
     * 第一个窗口索引0,拉伸1
     * 第二个窗口索引1,拉伸1
     * 第三个窗口索引2,拉伸2
    */
    splitter->setStretchFactor(0, 1);
    splitter->setStretchFactor(1, 1);
    splitter->setStretchFactor(2, 2);


    /*
     * [6]把分离器添加到窗口上
     * 创建一个layout
     * 添加组件的方式向layout添加分离器
     * 设置 layout 为程序的layout
    */
    QHBoxLayout *hlayout = new QHBoxLayout;
    hlayout->addWidget(splitter);

    m_widget->setContentsMargins(5, 5, 5, 5);
    m_widget->setLayout(hlayout);

    // 设置窗口大小
    //m_widget->setFixedSize(800, 200);
    this->setFixedSize(800, 200);

}

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();
}

3. 滚动区域

       当某个区域内的组件尺寸超过了预先设置好的范围时,可以使用QScrollArea提供的方法,生成滚动条,滚动显示组件内容。

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QScrollArea>
#include <QLabel>
#include <QHBoxLayout>

namespace Ui {
class MainWindow;
}

class MainWindow : public QWidget
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

private:
    QLabel *scrollArealabel;    // 声明一个标签

};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QWidget(parent)//,
    //ui(new Ui::MainWindow)
{
    //ui->setupUi(this);

    // [1]创建一个标签
    scrollArealabel = new QLabel;
    // 设置标签的最小尺寸,非常重要,否则有可能无法正常显示滚动条
    scrollArealabel->setMinimumSize(500,500);
    // 设置标签显示的内容,随便写点东西
    scrollArealabel->setText("helo world ");

    // [2]创建滚动区域,设置滚动区域关联的对象
    QScrollArea *scrollArea = new QScrollArea;
    // 把标签加到滚动区域,使用 setWidget() 函数
    scrollArea->setWidget(scrollArealabel);
    // 设置滚动区域的背景色
    scrollArea->setBackgroundRole(QPalette::Dark);

    // [3]创建一个布局
    QHBoxLayout *hlayout = new QHBoxLayout;
    // 把滚动区域加到布局上
    hlayout->addWidget(scrollArea);
    // 使布局生效
    this->setLayout(hlayout);
    // 设置窗口的大小,比标签的最小尺寸小,这样能显示滚动区域
    this->setFixedSize(400,400);
}

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();
}

4. 停靠区域

       在Qt中,停靠窗口主要是指可以在QMainWindow中停靠或可以浮动的独立窗口。停靠窗口有四个区域,每个窗口可以有自己的标题栏,用户可以通过拖拽的方式移动窗口。浮动窗口可以在下图中的白色区域内移动,QDockWidget 这个类提供了关于停靠窗口的方法。

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDockWidget>
#include <QLabel>
#include <QPushButton>
#include <QTextEdit>
#include <QVBoxLayout>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

private:
    QLabel        *label;           // 设置一个标签
    QPushButton   *button1;         // 按钮1
    QPushButton   *button2;         // 按钮2
    QPushButton   *button3;         // 按钮3
    QTextEdit     *textEdit;        // 文本框
};

#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);

    // [1]创建一个中心区域显示的文本框
    textEdit = new QTextEdit;
    textEdit->setText("main widget");
    // 设置文本框的大小
    textEdit->setFixedSize(300, 300);
    // 把文本框设置为程序中心窗口
    this->setCentralWidget(textEdit);
    // 设置组件与程序边框的距离
    this->setContentsMargins(15, 15, 15, 15);
    // 设置程序界面大小
    // this->setFixedSize(450, 330);


    // [2]创建组件
     label = new QLabel;
     label->setText("widget1");
     button1 = new QPushButton("aboutQt");
     button2 = new QPushButton("button2");
     button3 = new QPushButton("close");
     // 给两个按钮绑定槽,实现简单的功能
     connect(button1, SIGNAL(clicked()), qApp, SLOT(aboutQt()));// 关于QT
     connect(button3, SIGNAL(clicked()), this, SLOT(close()));  // 关闭程序

     // [3]创建页面布局,用于标签和按钮的布局
     QVBoxLayout *docklayout_1 = new QVBoxLayout;
     // 向布局添加组件
     docklayout_1->addWidget(label);
     docklayout_1->addStretch();
     docklayout_1->addWidget(button1);

     QVBoxLayout *docklayout_2 = new QVBoxLayout;
     // 向布局添加组件
     docklayout_2->addStretch();
     docklayout_2->addWidget(button2);
     docklayout_2->addWidget(button3);

     // [4]创建窗口组件
     QWidget *widget1 = new QWidget;
     QWidget *widget2 = new QWidget;

     // [5]设置窗口组件的布局
     widget1->setLayout(docklayout_1);
     widget2->setLayout(docklayout_2);

     // [6]创建停靠窗口,并把上面两个窗口添加到停靠窗口中
     QDockWidget *dock = new QDockWidget(tr("myDockWindow1"), this);
     // 设置停靠区域
     dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
     // 设置停靠窗口的属性
     dock->setFeatures(QDockWidget::DockWidgetMovable); //停靠窗口可移动属性
     // 窗口 widget1 设置为停靠窗口
     dock->setWidget(widget1);
     // 设置停靠窗口的大小
     // dock->setFixedSize(100,100);
     // 设置边框颜色
     dock->setStyleSheet((QString::fromUtf8("border:1px solid gray")));
     // 向程序主界面添加停靠窗口
     this->addDockWidget(Qt::RightDockWidgetArea, dock);

     QDockWidget *dock1 = new QDockWidget(tr("myDockWindow2"), this);
     // 设置停靠区域
     dock1->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
     // 设置停靠窗口的属性
     dock1->setFeatures(QDockWidget::AllDockWidgetFeatures); //具有停靠窗口的全部特性
     // 窗口 widget2 设置为停靠窗口
     dock1->setWidget(widget2);
     // 设置停靠窗口的大小
     // dock1->setFixedSize(100,200);
     // 设置边框颜色
     dock1->setStyleSheet((QString::fromUtf8("border:1px solid gray")));
     // 向程序主界面添加停靠窗口
     this->addDockWidget(Qt::RightDockWidgetArea, dock1);

     // [7]设置两个停靠窗口的位置,垂直排列
     splitDockWidget(dock, dock1, Qt::Vertical);
}

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();
}

备注:参考文章

Qt零基础系列06:如何进行界面布局管理 - 知乎

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt中布局管理使用总结 的相关文章

  • QTableView 中的虚拟列?

    我开始学习 Qt4 模型 视图编程 我有初学者问题 我有一个简单的应用程序 其中显示 sqlite 表QTableView class Model QtSql QSqlTableModel def init self parent None
  • MAC 上的 QT/C++ - 未设置应用程序图标

    我正在努力解决的奇怪问题 在与我的 pro QT 项目文件相同的文件夹中 我有一个 Resources myIcon png 我试图将其设置为我构建的应用程序的图标 在 OSX 上运行 我阅读了文档 它建议在 pro 文件中添加 ICON
  • 从 QML 实例化 C++ 对象会产生巨大的内存使用开销

    实例化一个QObjectC 堆中的派生类为每个对象提供了大约 160 个字节 通过注册相同的对象qmlRegisterType 用于从 QML 创建并通过以下方式动态创建对象createObject 每个对象给我 2000 多个字节 这是完
  • 为什么下面的重叠比较总是评估为 true

    我不明白为什么以下代码有警告 指出重叠比较始终评估为真 接下来的语句永远不会被执行 QVariant MainModel data const QModelIndex index int role const if index isVali
  • 如何在 Qt-Embedded 中(正确)输出多语言文本?

    我的目标系统是 linux 3 3 7 Qt Embedded 开源版 4 8 Droid 字体 取自 fonts droid 20111207 git 1 all deb Debian 软件包并复制到 usr lib fonts目录 主要
  • 程序意外完成 - QT Creator

    我正在尝试使用 QT Creator 使用 QT 框架开发 GUI 控制台应用程序 我使用的是Windows XP 我安装了QT 4 8 3和mingw 两者均已安装 没有任何错误 然后我安装了QT Creator QT 版本 路径中的 Q
  • 如何在按下托盘图标菜单操作时执行功能?

    int main int argc char argv QApplication oApp argc argv QAction action1 QMenu menu QSystemTrayIcon TrayIcon QIcon favico
  • QDesktopServices::openUrl 在资源管理器中选择指定文件

    在大多数编码程序中 您可以右键单击该项目 然后单击 在资源管理器中显示 它会在资源管理器中显示选定项目的文件 在 Qt 中使用 QDesktopServices 如何做到这一点 或在 QT 中执行此操作的任何方式 您可以使用此方法在 Win
  • 如何使用 Qtimer 添加 1 秒延迟

    我目前有一个方法如下 void SomeMethod int a Delay for one sec timer gt start 1000 After one sec SomeOtherFunction a 这个方法实际上是一个附加到信号
  • 在 Qt5 中,是否需要 Q_INVOKABLE 来从 QML 调用公共 QObject 函数?

    我刚刚意识到我可以调用暴露于 QML 的对象的几乎任何函数 现在我对 Q INVOKABLE 很好奇 Qt5docs http doc qt io qt 5 qtqml cppintegration exposecppattributes
  • 向 Qt 样式表添加特异性时丢失样式

    这是我的代码 const QString STYLE SHEET background color rgba x x x y border 1px solid gray border radius 0px border top 1px so
  • 如何将图像显示为缩略图

    我有一个QTreeView显示硬盘驱动器和目录 我也有一个QListView显示图像文件如下 但我想将图像显示为缩略图 如下所示 My code mainWidget mainWidget QWidget parent QWidget pa
  • 为 Windows 98 编译 Qt

    我需要支持 Windows 98 Qt 文档声称这是可能的 但没有说明 Qt 4 6 的分布式二进制文件不能在 Win98 上运行 而且我采样的大多数 Qt 应用程序也不能在 Win98 上运行 对于几个确实在 98 上运行的应用程序 我询
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • PyQt5:如何使QThread返回数据到主线程

    I am a PyQt 5 4 1 1初学者 我的Python是3 4 3 这是我尝试遵循的many https mayaposch wordpress com 2011 11 01 how to really truly use qthr
  • QML 连接:不推荐使用连接中隐式定义的 onFoo 属性

    升级到 Qt 5 15 时收到以下错误消息 QML Connections Implicitly defined onFoo properties in Connections are deprecated Use this syntax
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 安装J语言的JQt IDE,出现错误

    我一直按照这里的说明进行操作 http code jsoftware com wiki System Installation Linux http code jsoftware com wiki System Installation L

随机推荐

  • 【图片标注】推荐一款特别好用的图片分割标注工具EIseg

    前言 最近在百度飞浆的公众号看到一个特别有趣的图片标注工具EIseg 它labelme等标记工具不同的是 它是一个通过深度学习来标注的工具 使用鼠标点一下就能完成标注任务 下面是工具的演示 本文章仅供学习 操作演示 标注效果 绿色的点为正样
  • java jps监控_java性能监控工具jps-windows

    jps Lists the instrumented Java Virtual Machines JVMs on the target system This command is experimental and unsupported
  • mybatis jdbcType: DATE ,TIMESTAMP 区别:

    1 mybatis中 jdbcType 时间类型 当jdbcType DATE 时 只传入了 年月日 jdbcType TIMESTAMP 年月日 时分秒 2 jdbcType 是否必须 使用时 没有加jdbcType 正常 加上jdbcT
  • 【零知ESP8266教程】AP模式下WIFI UDP协议通信示例

    本帖主要讲解ESP8266 WIFI功能关于UDP协议网络传输的应用 这里演示了ESP8266在AP模式下UDP通信的示例 1 硬件 零知ESP8266开发板 2 软件 1 代码如下 文件 udp server ino by 零知实验室 u
  • 为什么 DeFi 需要探索以太坊外的世界?

    由于DeFi生态系统的总锁仓价值超过130亿美元 DeFi创造了最近几周的最高纪录 可以说 DeFi是当前加密货币行业发展最快的一个领域 在短短几个月内吸引了大量资本和市场参与者 在这一强劲势头下 以太坊仍是DeFi市场的主宰 占据了96
  • 联想网络同传系统_皮层网络结构的联想学习“理论”

    本文来自公众号 吴思Lab计算神经科学及类脑计算 AI科技评论 获授权转载 如需转载 请联系吴思Lab 编者按 张单可博士是我们课题组已毕业的博士生 最近刚从美国东北大学做完博士后回来 在中国科学院深圳先进技术研究院工作 这是他在博士后期间
  • 平台使用篇

    本课程提供的实验平台总体可以分成两个部分 硬件平台和软件平台 本讲简要介绍各个部分的基本组成及实验开发流程 平台使用篇 RflySim飞控底层实验平台配置介绍 01 电脑配置 1 1推荐配置 系统 Windows 10 x64系统 版本大于
  • MySQL如何查询表中重复的数据

    文章目录 一 查询重复记录 二 总结 一 查询重复记录 例 查询员工表里出现重复姓名的记录 思路 1 查看重复记录 首先要使用分组函数 group by 再用聚合函数中的计数函数count name 给姓名列计数 且使用group by 后
  • 【论文阅读】BGRL:Bootstrapped Representation Learning on Graphs

    目录 摘要 1 引言 2 Bootstrapped Graph Latents BGRL 2 1 BGRL组件 2 2 BGRL更新步骤 2 2 1 更新 2 2 2 更新
  • 解密全产业供应关系,助力企业寻找客户资源,洞察商机

    在当今商业竞争日益激烈的时代 企业要实现长期可持续的发展 需要深入了解供应链关系 抢先捕获商机 拓展优质的客户资源 然而 供应链关系错综复杂 商机 客户隐藏在其中 如何挖掘和洞察成为了企业亟需解决的难题 五度易链基于产业链上下游的视角 帮助
  • 合并两个有序数组(go实现

    合并两个有序数组 go实现 题目描述 解题思路 代码示例 执行结果 更多 题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2 另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目 请你 合并
  • 机器学习python实现,自我总结

    机器学习代码及套用 网上很多机器学习的资料 我看了很多 最后发现用的时候其实没有那么复杂 也不需要了解很多的数学知识 也庆幸自己没有在上机器学习的课时放弃 写篇文章来总结总结吧 本文使用python来套 导入机器学习模块 自己随便百度一下机
  • centos网页/phpmyadmin 打不开_苹果手机Safari打不开网页?按下一个键,马上就能用...

    Safari 苹果手机自带的一个浏览器 很多人都认为是个垃圾 甚至把它卸载 但其实 Safari是当时乔布斯最看重的一个苹果武器 如果真要好好利用起来 这个自带软件远远比你想象的厉害
  • 下载LAMBDA Group的代码

    LAMBDA Group 的文章在其主页有公布代码和数据集 具体在其 主页 gt 数据与代码 下面的 代码 栏列了文章 比如点开第一篇 AcMR 里面有个下载代码的链接 code 但点开会发现 无法链接到服务器 根据杨嘉祺的邮件回复 在网址
  • Google前工程经理王忻:如何准备软件工程师的面试

    2010 10 20 10 48 4639次阅读 来源 伯乐在线 职场博客 已有0条评论 发表评论 关键词 Google 软件工程师 面试 作者 人力资源 收藏这篇资讯 导读 原文作者王忻 Google前工程经理 2003年月加入Googl
  • 【华为OD机试真题2023B卷 JAVA&JS】人气最高的店铺

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 人气最高的店铺 知识点贪心排序 时间限制 1s 空间限制 32MB 限定语言 不限 题目描述 某购物城有m个商铺 现决定举办一场活动选出人气最高店铺 活动共有n位市民参与 每位市民只能
  • 微信小程序Token登录验证

    上图是微信开发文档提供的图 最近开发一款小程序 看了许久的微信文档 这里来记录一下其中的登录与授权过程 总体流程 前端执行wx login 获取code传给后端 后端通过微信官方的登录凭证校验接口获取到session key与openid
  • 使用PHP语言实现ETH 及 token转账

    以太坊转账 废话不多说直接上代码 代码下载地址 https download csdn net download u012841825 11021920 github代码 用你们可爱的小手 点一下星星 https github com zc
  • Angular 模态框 入坑记

    今天用到了ui bootstrap中的modal 觉得用起来还不错 也比较简单 博主以前用个ngDialog做的模态框 虽然不知道对不对 但这个插件也还可以 这貌似是我目前为止用过最简单的功能了 所以博客内容也很简单 大家一看就能懂 因为博
  • Qt中布局管理使用总结

    目录 1 五大布局 1 1 QVBoxLayout垂直布局 1 2 QHBoxLayout水平布局 1 3 QGridLayout网格布局 1 4 QFormLayout表单布局 1 5 QStackedLayout分组布局 1 6 五大布