QT 布局类

QT布局

QLayout 类

QLayout 类是 Qt 中所有布局类的基类,用于管理窗口部件的布局。

布局类负责在窗口或容器中排列子部件,确保它们按照指定的规则进行排列和调整大小。

Qt 提供了几种常见的布局类,包括 QHBoxLayout、QVBoxLayout、QGridLayout 和 QFormLayout。

QObject
  └── QLayoutItem
      └── QLayout
          ├── QBoxLayout
          │   ├── QHBoxLayout
          │   └── QVBoxLayout
          ├── QGridLayout
          └── QFormLayout

          
继承关系详解
    
    QObject:
        QObject 是 Qt 中所有可实例化类的基类,提供了信号和槽机制、对象树管理和运行时类型信息等功能。
    
    QLayoutItem:
        QLayoutItem 是一个抽象类,提供了布局项的基本接口,用于描述如何在布局中排列和调整大小。
    
    QLayout:
        QLayout 继承自 QObject 和 QLayoutItem,是所有布局类的基类。它提供了布局管理的基本功能,如添加和移除子部件、设置布局参数等。
    
    QBoxLayout:
        QBoxLayout 继承自 QLayout,是一个抽象类,提供了盒式布局的基本功能。盒式布局包括水平布局和垂直布局。
        QHBoxLayout 和 QVBoxLayout 是 QBoxLayout 的具体实现类,分别用于水平和垂直布局。
    
    QGridLayout:
        QGridLayout 继承自 QLayout,提供了网格布局功能,可以将子部件按照行和列排列。
    
    QFormLayout:
        QFormLayout 继承自 QLayout,提供了表单布局功能,通常用于排列标签和输入框。

布局示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLineEdit>
#include <QComboBox>
#include <QTextEdit>
#include <QPushButton>
#include <QGridLayout>
#include <QDialog>
#include <QLabel>
#include <QComboBox>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QDialog
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    // 左侧布局
    QLabel * UserNumber; // 用户编号
    QLineEdit * UserNumberEdit; // 用户编号编辑框
    QLabel * UserName;// 用户姓名
    QLineEdit * UserNameEdit;// 用户姓名编辑框
    QLabel * UserSex;// 用户性别
    QComboBox * UserSexCombo; // 用户性别下拉框
    QLabel * UserDepart;// 用户部门
    QTextEdit * UserDepartEdit; // 用户部门编辑框
    QLabel * UserAge;// 用户年龄
    QLineEdit * UserAgeEdit; // 用户年龄编辑框

    QGridLayout * gridLayout; // 网格布局


    // 右侧布局
    QVBoxLayout * rtLayout; // 网格布局
    QLabel * myselfInfo; // 信息
    QTextEdit * myselfInfoEdit; // 信息编辑框

    //右边底部按钮
    QHBoxLayout * rthLayout; // 网格布局
    QPushButton * addBtn; // 添加按钮
    QPushButton * deleteBtn; // 删除按钮
    QPushButton * modifyBtn; // 修改按钮
    QPushButton * queryBtn; // 查询按钮
    QPushButton * clearBtn; // 清空按钮






private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

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

MainWindow::MainWindow(QWidget *parent)
    : QDialog(parent)

{

    //设置窗口大小
    //this->setGeometry(0,0,400,300);
    this->setWindowTitle("My App");

    //左侧
    UserNumber=new QLabel("编号");
    UserNumberEdit=new QLineEdit();

    UserName=new QLabel("姓名");
    UserNameEdit=new QLineEdit();

    UserSex=new QLabel("性别");
    UserSexCombo=new QComboBox();
    UserSexCombo->addItem("男");
    UserSexCombo->addItem("女");

    UserDepart=new QLabel("部门");
    UserDepartEdit=new QTextEdit();

    UserAge=new QLabel("年龄");
    UserAgeEdit=new QLineEdit();



    //设置布局
    gridLayout=new QGridLayout();
    gridLayout->addWidget(UserNumber,0,0);
    gridLayout->addWidget(UserNumberEdit,0,1);

    gridLayout->addWidget(UserName,1,0);
    gridLayout->addWidget(UserNameEdit,1,1);

    gridLayout->addWidget(UserSex,2,0);
    gridLayout->addWidget(UserSexCombo,2,1);

    gridLayout->addWidget(UserDepart,3,0);
    gridLayout->addWidget(UserDepartEdit,3,1);

    gridLayout->addWidget(UserAge,4,0);
    gridLayout->addWidget(UserAgeEdit,4,1);


    //右侧
    rtLayout=new QVBoxLayout();
    myselfInfo=new QLabel("个人信息");
    myselfInfoEdit=new QTextEdit();
    rtLayout->addWidget(myselfInfo);
    rtLayout->addWidget(myselfInfoEdit);

    //右边底部按钮
    rthLayout =new QHBoxLayout();
    addBtn=new QPushButton("添加");
    deleteBtn=new QPushButton("删除");
    modifyBtn=new QPushButton("修改");
    queryBtn=new QPushButton("查询");
    clearBtn=new QPushButton("清空");

    rthLayout->addWidget(addBtn);
    rthLayout->addWidget(deleteBtn);
    rthLayout->addWidget(modifyBtn);
    rthLayout->addWidget(queryBtn);
    rthLayout->addWidget(clearBtn);

    //rtLayout->addLayout(rthLayout);


    QGridLayout* l= new QGridLayout(this);
    l->addLayout(gridLayout,0,0);
    l->addLayout(rtLayout,0,1);
    l->addLayout(rthLayout,1,1);

}

MainWindow::~MainWindow()
{

}

QWidget 类

是 Qt 库中的一个核心类,用于创建用户界面组件。

它是所有用户界面元素的基类,包括窗口、按钮、标签等。

QWidget 提供了基本的窗口功能,如事件处理、布局管理、绘图等。

QStackedWidget 类

QStackedWidget 是 Qt 库中的一个容器类,用于管理一组 QWidget 对象,每次只显示其中一个子部件。

它类似于一个堆栈,可以在不同的子部件之间进行切换。

QStackedWidget 常用于实现选项卡式界面或多页面应用程序。


QObject
  └── QWidget
      └── QFrame
          └── QStackedWidget
继承关系详解
QObject
QStackedWidget 继承自 QWidget,而 QWidget 继承自 QObject。QObject 是 Qt 中所有对象的基类,提供了对象树管理、信号和槽机制、事件处理等核心功能。

QWidget
QStackedWidget 继承自 QWidget,这是所有用户界面组件的基类,提供了基本的窗口功能,如事件处理、布局管理、绘图等。

QFrame
QStackedWidget 继承自 QFrame,QFrame 是一个带有边框的 QWidget 子类。QFrame 提供了一些额外的功能,如设置边框样式等。

QStackedWidget
QStackedWidget 是 QFrame 的子类,专门用于管理一组 QWidget 对象,每次只显示其中一个子部件。

示例代码:

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QListWidget>
#include <QStackedWidget>
#include <QLabel>
#include <QBoxLayout>
QT_BEGIN_NAMESPACE
namespace Ui {
class Dialog;
}
QT_END_NAMESPACE

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();

private:
    QStackedWidget *stacks;
    QListWidget *list;
    QLabel *label1;
    QLabel *label2;
    QLabel *label3;
    QLabel *label4;

    Ui::Dialog *ui;


};
#endif // DIALOG_H

#include "dialog.h"
#include "./ui_dialog.h"

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

    setWindowTitle("堆叠部件");

    list=new QListWidget(this);
    list->insertItem(0,"item1");
    list->insertItem(1,"item2");
    list->insertItem(2,"item3");
    list->insertItem(3,"item4");

    label1=new QLabel("label1");
    label2=new QLabel("label2");
    label3=new QLabel("label3");
    label4=new QLabel("label4");


    //创建堆叠部件
    stacks=new QStackedWidget(this);
    stacks->addWidget(label1);//添加到堆叠部件中
    stacks->addWidget(label2);
    stacks->addWidget(label3);
    stacks->addWidget(label4);



    QHBoxLayout *layout=new QHBoxLayout(this);//创建水平布局
    layout->addWidget(list);
    layout->setStretchFactor(list,1);//设置list的拉伸因子为1,以便拉伸

    layout->addWidget(stacks);
    layout->setStretchFactor(stacks,2);//设置stacks的拉伸因子为2,以便拉伸

    setLayout(layout);
    // 连接 QListWidget 的 currentRowChanged 信号和 QStackedWidget 的 setCurrentIndex 槽
    connect(list, &QListWidget::currentRowChanged, stacks, &QStackedWidget::setCurrentIndex);
}

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

QSplitter 类

QSplitter 是 Qt 库中的一个容器类,

用于管理一组子部件,并允许用户通过拖动分隔条来调整子部件的大小。

QSplitter 常用于创建可调整大小的布局,如分割窗口或面板。

QObject
  └── QWidget
      └── QFrame
          └── QSplitter
          
QObject:所有 Qt 对象的基类,提供对象树管理、信号和槽机制、事件处理等核心功能。
QWidget:所有用户界面组件的基类,提供基本的窗口功能。
QFrame:带有边框的 QWidget 子类,提供一些额外的功能,如设置边框样式等。
QSplitter:用于管理一组子部件,并允许用户通过拖动分隔条来调整子部件的大小。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSplitter>
#include <QTextEdit>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

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

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

    //拆分窗口 使用 水平分割
    QSplitter *splitter = new QSplitter(Qt::Horizontal, 0);//参数 0 表示默认分割位置
    QTextEdit *textEdit= new QTextEdit("窗口1",splitter);



    QSplitter *splitter2 = new QSplitter(Qt::Vertical,splitter); //垂直分割
    QTextEdit *textEdit2= new QTextEdit("窗口2",splitter2);
    QTextEdit *textEdit3= new QTextEdit("窗口3",splitter2);

    splitter->show();
}

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

QDockWidget 类

QDockWidget 是 Qt 库中的一个容器类,用于创建可停靠的窗口部件。

QDockWidget 通常与 QMainWindow 一起使用,允许用户将窗口部件停靠在主窗口的边缘,或者浮动为独立的窗口。

QDockWidget 提供了灵活的布局管理功能,适用于创建复杂的用户界面。

QObject
  └── QWidget
      └── QFrame
          └── QDockWidget
QObject:所有 Qt 对象的基类,提供对象树管理、信号和槽机制、事件处理等核心功能。
QWidget:所有用户界面组件的基类,提供基本的窗口功能。
QFrame:带有边框的 QWidget 子类,提供一些额外的功能,如设置边框样式等。
QDockWidget:用于创建可停靠的窗口部件,通常与 QMainWindow 一起使用。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTextEdit>
#include <QDockWidget>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    void DockWidgetfunc();
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

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

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

    DockWidgetfunc();

}

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

void MainWindow::DockWidgetfunc(){
    setWindowTitle("测试停靠窗口");

    QDockWidget *dock1 = new QDockWidget("窗口1",this);
    QDockWidget *dock2 = new QDockWidget("窗口2",this);
    QDockWidget *dock3 = new QDockWidget("窗口3",this);

    //设置窗口
    addDockWidget(Qt::RightDockWidgetArea,dock1);
    addDockWidget(Qt::LeftDockWidgetArea,dock2);
    addDockWidget(Qt::TopDockWidgetArea,dock3);
    
    dock1->setFeatures(QDockWidget::DockWidgetMovable);//设置停靠窗口可移动
    //设置停靠位置为 :右侧 顶部
    dock1->setAllowedAreas(Qt::LeftDockWidgetArea|Qt::TopDockWidgetArea);
    //设置停靠位置为 :左侧 顶部
    dock2->setAllowedAreas(Qt::RightDockWidgetArea|Qt::TopDockWidgetArea);
    
    //设置停靠窗口的大小
    dock1->setFixedWidth(200);
    dock1->setFixedHeight(100);

    //添加控件
    QTextEdit *textEdit = new QTextEdit();
    dock1->setWidget(textEdit);
    textEdit->setPlainText("这里是窗口1的内容");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可能只会写BUG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值