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的内容");
}