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);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 如果Qt的水平布局不生效,可能是由于设置了错误的边距或样式表导致的。首先,检查布局的边距设置是否正确。根据Qt官网介绍,可以使用QLayout的setContentsMargins函数来设置布局的左、上、右、下边距。默认情况下,Qt使用由样式提供的值,大多数平台的边距是11像素。确保边距设置正确,以便布局能够正确显示。\[1\] 另外,如果您在使用QLabel时设置了样式表,但样式表不生效,可能是由于样式表的语法错误导致的。请确保您的样式表语法正确,例如正确使用了属性和值的语法,以及正确的分号和引号。您可以参考Qt官网的样式表文档来确保您的样式表设置正确。\[2\] 最后,还要注意布局管理器的位置属性继承于父部件的大小。根据Qt官网介绍,QBoxLayout和QGridLayout的位置属性取决于其父部件的大小。因此,如果父部件的大小不正确,可能会导致布局不生效。请确保父部件的大小正确设置,以便布局能够正确显示。\[3\] 综上所述,如果Qt的水平布局不生效,您可以检查边距设置、样式表语法和父部件的大小设置,以确保布局能够正确显示。 #### 引用[.reference_title] - *1* *3* [Qt 使用布局管理器失效或者异常](https://blog.csdn.net/qq_39280795/article/details/122350945)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [QT样式表设置不生效问题](https://blog.csdn.net/qq_42317817/article/details/123659180)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值