Qt的布局
QHBoxLayout 水平布局
QVBoxLayout 垂直布局
QFormLayout 表单布局
QGridLayout 栅格布局
QSplitter 分栏布局
QHBoxLayout水平布局 & QVBoxLayout垂直布局
1.增加到布局中
QHBoxLayout *ui_hLayMain = new QHBoxLayout;
ui_hLayMain->addWidget(ui_btn1);
2.设置边距
是用来调整左右上下的边距的。
void setMargin(int) //这个函数好像没有了,可以不用这个
void setContentsMargins(int left, int top, int right, int bottom);
void setContentsMargins(const QMargins &margins);
3.设置布局中控件之间的距离
void setSpacing(int);
4.增加弹簧
ui_hLayMain->addStretch();
5.设置其它显示方式,布局器中也可以添加布局器
显示方式:
ui_hLayMain->addWidget(ui_btn1, 0, Qt::AlignLeft | Qt::AlignTop);
ui_hLayMain->addWidget(ui_btn2, 0, Qt::AlignLeft | Qt::AlignTop);
ui_hLayMain->addWidget(ui_btn3);
ui_hLayMain->addWidget(ui_btn4, 0, Qt::AlignLeft | Qt::AlignBottom);
ui_hLayMain->addWidget(ui_btn5, 0, Qt::AlignLeft | Qt::AlignBottom);
void addWidget(QWidget *, int stretch = 0, Qt::Alignment alignment = 0);
void addLayout(QLayout *layout, int stretch = 0);
6.伸缩系数
bool setStretchFactor(QWidget *w, int stretch);
bool setStretchFactor(QLayout *l, int stretch);
void setStretch(int index, int stretch);
7.垂直布局和水平布局切换
可以将水平布局改变为垂直布局,一般不用
void setDirection(Direction);
QFormLayout 表单布局
只有两列,但可以有多行,通常情况下左侧添加文本,右侧添加控件或另外的布局器。
1.增加进布局
void addRow(QWidget *label, QWidget *field);
void addRow(QWidget *label, QLayout *field);
void addRow(const QString &labelText, QWidget *field);
void addRow(const QString &labelText, QLayout *field);
void addRow(QWidget *widget);
void addRow(QLayout *layout);
2.RowWrapPolicy 显示策略
RowWrapPolicy 是一个枚举类型,有三个属性值:
属性名 | 值 | 描述 |
---|---|---|
QFormLayout::DontWrapRows | 0 | 输入框始终在标签旁边。在本实验环境下,默认为该属性 |
QFormLayout::WrapLongRows | 1 | 标签有足够的空间适应,如果最小大小比可用空间大,输入框会被换到下一行 |
QFormLayout::WrapAllRows | 2 | 输入框始终在标签下边 |
3.ItemRole
设置行对应的控件,使用 QFormLayout 的 ItemRole 属性,ItemRole 时枚举类型:
属性名 | 值 | 描述 |
---|---|---|
QFormLayout::LabelRole | 0 | 标签 |
QFormLayout::FieldRole | 1 | 输入框 |
QFormLayout::SpanningRole | 2 | 跨越标签和输入框的控件 |
4.设置边距
void setContentsMargins(int left, int top, int right, int bottom);
void setContentsMargins(const QMargins &margins);
5.设置间距
由于是表单,可以单独设置水平间距和垂直间距。
void setSpacing(int spacing);
void setHorizontalSpacing(int spacing);
void setVerticalSpacing(int spacing);
QGridLayout 栅格布局
栅格布局将位于其中的窗口控件放入网状的栅格之中,将提供给它的空间划分为行和列,并将每个窗口控件插入并管理到正确的单元格。当界面布局比较复杂时使用栅格布局器会使得布局变得简单。
栅格布局器与其他类型的布局器的使用方法有所不同,栅格布局器比其他布局器相对复杂,主要体现在栅格布局添加窗口控件的方式。
1.增加到布局
当前单元将从 row 和 column 开始,扩展到 rowSpan 和 columnSpan 指定的倍数的行和列。如果 rowSpan 或 columnSpan 的值为 -1,则窗口控件将扩展到布局的底部或者右边边缘处,Qt::Alignment 为对齐方式。
void addWidget(QWidget *, int row, int column, Qt::Alignment = 0);
void addWidget(QWidget *, int row, int column, int rowSpan, int columnSpan, Qt::Alignment = 0);
void addLayout(QLayout *, int row, int column, Qt::Alignment = 0);
void addLayout(QLayout *, int row, int column, int rowSpan, int columnSpan, Qt::Alignment = 0);
2.设置行、列的伸缩空间。
// 设置行、列的比例
void setRowStretch(int row, int stretch);
void setColumnStretch(int column, int stretch);
3.设置间距。
void setSpacing(int spacing); // 可以同时设置水平、垂直间距,设置之后,水平、垂直间距相同。
void setHorizontalSpacing(int spacing); // 设置水平间距
void setVerticalSpacing(int spacing); // 垂直间距
4.设置最小行高、最小列宽。
void setRowMinimumHeight(int row, int minSize);
void setColumnMinimumWidth(int column, int minSize);
5.获取行数、列数。
int columnCount();
int rowCount();
6.设置对齐方式。
void setAlignment(Qt::Alignment a);
QSplitter 分栏布局
分栏布局是将软件界面分为两个或两个以上的区域,可以在水平或者垂直方向对窗口分栏布局。QSplitter 是 Qt 专门用于分栏的一个类,QSplitter 类似于布局器,但 QSplitter 只能添加 QWidget 或继承自 QWidget 的窗口控件。同时 QSplitter 对象也可以放在其他窗口控件或布局器中,因为 QSplitter 也是继承自 QFrame。
1.增加控件
QSplitter 添加其他窗口控件有两种方式:一种是在实例化其他窗口控件时将 QSplitter 的对象作为父类传入;第二种是通过 addWidget 方法将其他窗口控件添加至分栏中。
// 第一种方式
QSplitter *ui_splitter = new QSpliiter(Qt::Horizontal);
QWidget *ui_w1 = new QWidget(ui_spliiter);
// 第二种方式
QSplitter *ui_splitter = new QSpliiter;
QWidget *ui_w1 = new QWidget;
ui_splitter.addWidget(ui_w1);
2.设置最小尺寸
示例程序中使用 QTextEdit,这是因为 QWidget 的背景色与 QSplitter 背景色相同,演示不明显。而设置 QSplitter 窗口最小尺寸是为了保证窗口在缩小至最小时不至于看不见,也是软件开始的体验效果。
void setMinimumSize(const QSize &s);
void setMinimumSize(int w, int h);
3.设置样式
在项目中,如果为了软件的样式,需要设置分栏拖动条的样式同样也是可以做到的。
// 设置颜色,可以使用 QSS 给分栏拖动条设置颜色甚至是渐变色
QString style = "QSplitter{background-color:red;}";
ui_hSplitter->setStyleSheet(style);
4.设置宽度
设置分栏拖动条宽度有两种方式:一种是使用接口;另一种是使用 QSS 样式。
// 程序接口设置分栏拖动条宽度
ui_hSplitter->setHandleWidth(1);
// QSS 设置分栏拖动条宽度
QString style = "QSplitter{height:1px;}";
ui_hSplitter->setStyleSheet(style);
5.设置拖动方式
拖动方式即实时刷新拖动和拖动完成后刷新,默认实时拖动刷新。
void setOpaqueResize(bool opaque = true);
6.设置窗口比例
在初始化情况窗口显示比例可以通过接口设置。其中 index 为插入窗口控件序号,stretch 为伸缩比例。
void setStretchFactor(int index, int stretch);