Qt的布局

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::DontWrapRows0输入框始终在标签旁边。在本实验环境下,默认为该属性
QFormLayout::WrapLongRows1标签有足够的空间适应,如果最小大小比可用空间大,输入框会被换到下一行
QFormLayout::WrapAllRows2输入框始终在标签下边

3.ItemRole

设置行对应的控件,使用 QFormLayout 的 ItemRole 属性,ItemRole 时枚举类型:

属性名描述
QFormLayout::LabelRole0标签
QFormLayout::FieldRole1输入框
QFormLayout::SpanningRole2跨越标签和输入框的控件

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