Qt之水平/垂直布局(QBoxLayout、QHBoxLayout、QVBoxLayout)

简述

QBoxLayout可以在水平方向或垂直方向上排列控件,由QHBoxLayout、QVBoxLayout所继承。

QHBoxLayout:水平布局,在水平方向上排列控件,即:左右排列。 
QVBoxLayout:垂直布局,在垂直方向上排列控件,即:上下排列。

通过查看源码,我们可以发现,水平布局、垂直布局除了构造时的方向(LeftToRight、TopToBottom)不同外,其它均相同。

下面我们以QHBoxLayout为例,来讲解QBoxLayout的常用功能。

 

  • 简述
  • 使用
    • 效果
    • 源码
  • 常用接口
  • 总结

 

使用

下面介绍下水平布局的基本使用。

效果

这里写图片描述

源码

下面,我们创建5个按钮,然后添加至水平不居中。

QPushButton *pButton1 = new QPushButton("One");
QPushButton *pButton2 = new QPushButton("Two"); QPushButton *pButton3 = new QPushButton("Three"); QPushButton *pButton4 = new QPushButton("Four"); QPushButton *pButton5 = new QPushButton("Five"); QHBoxLayout *pHLayout = new QHBoxLayout(); pHLayout->addWidget(pButton1); pHLayout->addWidget(pButton2); pHLayout->addWidget(pButton3); pHLayout->addWidget(pButton4); pHLayout->addWidget(pButton5); setLayout(pHLayout);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

常用接口

我们可以看到,默认的外边距为0,为了美观性我们可以设置下Margin。

  • setMargin(int)
  • setContentsMargins(int left, int top, int right, int bottom);
  • setContentsMargins(const QMargins &margins) 
    设置外边距

setMargin可以设置左、上、右、下的外边距,设置之后,他们的外边距是相同的。 
setContentsMargins与其功能相同,但是可以将左、上、右、下的外边距设置为不同的值。

这里我使用setMargin(10)将外边距设置为10。

这里写图片描述


  • setSpacing(int) 
    设置间距

一般情况下,会有一个默认间距值,为了保持所有布局的统一性,或者你需要一个更合适的间距值,则需要手动设置。

这里我使用setSpacing(0)将间距设置为0。

这里写图片描述


  • addStretch() 
    添加了一个伸缩空间(QSpacerItem)。

居右

这里写图片描述

在第一个控件之前添加伸缩,这样所有的控件就会居右显示。

QHBoxLayout *pHLayout = new QHBoxLayout();
pHLayout->addStretch();  // 添加伸缩 pHLayout->addWidget(pButton1); pHLayout->addWidget(pButton2); pHLayout->addWidget(pButton3); pHLayout->addWidget(pButton4); pHLayout->addWidget(pButton5);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

居左

这里写图片描述

在最后一个控件之后添加伸缩,这样所有的控件就会居左显示。

QHBoxLayout *pHLayout = new QHBoxLayout();
pHLayout->addWidget(pButton1);
pHLayout->addWidget(pButton2); pHLayout->addWidget(pButton3); pHLayout->addWidget(pButton4); pHLayout->addWidget(pButton5); pHLayout->addStretch(); // 添加伸缩
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

居中

这里写图片描述

在第一个控件之前、最后一个控件之后添加伸缩,这样所有的控件就会居中显示。

QHBoxLayout *pHLayout = new QHBoxLayout();
pHLayout->addStretch();  // 第一个控件之前添加伸缩 pHLayout->addWidget(pButton1); pHLayout->addWidget(pButton2); pHLayout->addWidget(pButton3); pHLayout->addWidget(pButton4); pHLayout->addWidget(pButton5); pHLayout->addStretch(); // 最后一个控件之后添加伸缩 pHLayout->setSpacing(10);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

均分

这里写图片描述

在每一个控件之间都添加伸缩,这样所有的控件之间的间距都会相同。

QHBoxLayout *pHLayout = new QHBoxLayout();
pHLayout->addStretch();
pHLayout->addWidget(pButton1); pHLayout->addStretch(); pHLayout->addWidget(pButton2); pHLayout->addStretch(); pHLayout->addWidget(pButton3); pHLayout->addStretch(); pHLayout->addWidget(pButton4); pHLayout->addStretch(); pHLayout->addWidget(pButton5); pHLayout->addStretch(); pHLayout->setSpacing(0);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

  • addWidget(QWidget *, int stretch = 0, Qt::Alignment alignment = 0) 
    添加控件

默认的,我们添加控件至水平布局中,默认都是垂直方向居中对齐的。

例如:

这里写图片描述

其中有控件大小不相同的时候就会看得很明显了,如果我们需要将其中的某些控件居上、居下显示,那么可以使用对齐方式Qt::Alignment。

下面,我们使用向上、向下对齐来设置其它控件。

这里写图片描述

QHBoxLayout *pHLayout = new QHBoxLayout();
pHLayout->addStretch();
// 水平居左 垂直居上 pHLayout->addWidget(pButton1, 0 , Qt::AlignLeft | Qt::AlignTop); pHLayout->addWidget(pButton2, 0 , Qt::AlignLeft | Qt::AlignTop); pHLayout->addWidget(pButton3); // 水平居左 垂直居下 pHLayout->addWidget(pButton4, 0 , Qt::AlignLeft | Qt::AlignBottom); pHLayout->addWidget(pButton5, 0 , Qt::AlignLeft | Qt::AlignBottom); pHLayout->setSpacing(10);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

  • setDirection(Direction) 
    设置布局方向

可以设置从左到右、从右到左、从上到下、从下到上等。。。

setDirection(QBoxLayout::RightToLeft)

这里写图片描述

setDirection(QBoxLayout::TopToBottom);

这里写图片描述

既然使用了QHBoxLayout,一般就不建议使用TopToBottom或者BottomToTop,如果实在确定不了方向,或者方向可以随意变化,那么建议使用QBoxLayout。


  • setStretchFactor(QWidget *w, int stretch);
  • setStretchFactor(QLayout *l, int stretch); 
    设置控件、布局的拉伸系数

当窗体大小变化时,控件会根据拉伸系数来做相应的调整。

这里写图片描述

setStretchFactor(pButton1, 1); 
setStretchFactor(pButton2, 2);

设置pButton1的拉伸系数为1,pButton2拉伸系数为2,当窗体变大时,会优先将pButton2进行拉伸,当达到一定程度时,再拉伸pButton1,pButton1与pButton2的宽度比例为1:2。

总结

上面介绍了基本所有常用的接口使用,还有一些inset…接口,和它们功能相同,只不过是需要传递控件所在的索引index。常用的这些接口掌握了,其它布局QVBoxLayout、QGridLayout功能也相同或类似,一通百通

转载于:https://www.cnblogs.com/lifan3a/articles/7795177.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Optaplanner终于支持多线程并行运行 - Multithreaded incremental solving

Optaplanner 7.9.0.Final之前,启动引擎开始对一个Problem进行规划的时候,只能是单线程进行的。也就是说,当引擎对每一个possible solution进行分数计算的过程中,细化到每个步骤(Caculation),都只能排队在同一个线程中依…

python棋盘格_干货必看 | Python的turtle库之经典棋盘格

国际棋盘格是一个由9横9纵的线组成的格子正方形,用Python的turtle库进行绘制的时候,先做9横9纵的线,再填上灰色小正方形,这就可以完成一个棋盘格了,下面是具体的操作步骤。(一)整体代码1、import turtleimport turtle2…

一位技术老人给.NET初学者的一些建议

.NET平台应用领域众多,随着这些年的不断更新迭代,日趋臻善,也受到越来越多的开发者青睐。自从2000 年6 月22 日 微软推出Microsoft.NET 战略 ,至今已有22载,这些年新技术,新框架层出不穷,目不暇…

android 本地数据库sqlite的封装

单机android sqlite数据库的实现,这个数据库可与程序一起生成在安装包中一、下载sqlite3.exe文件二、运行 cmd 转到sqlite3.exe 所在目录 运行 sqlite3.exe 数据库名.db然后会出现sqlite>的命令提示符输入创建表的语句, create table 表名&#xf…

ResourceManager中的Resource Estimator框架介绍与算法剖析

欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 本文由宋超发表于云社区专栏 本文首先介绍了Hadoop中的ResourceManager中的estimator service的框架与运行流程,然后对其中用到的资源估算算法进行了原理剖析。 一. Resource Estimator Service…

几十款 WPF 控件 - UI 库,总有一款适合你

几十款 WPF 控件 - UI 库,总有一款适合你独立观察员 2022 年 10 月 16 日引言众所周知,使用 WPF 框架能够开发出功能强大、界面美观的桌面端应用。能够达到这个效果,各种 WPF 的控件库、UI 库功不可没。所以,想着能不能收集一下目…

mysql将系统权限授予用户_mysql创建用户并授予权限

1、create schema [数据库名称] default character set utf8 collate utf8_general_ci;--创建数据库采用create schema和create database创建数据库的效果一样。2、create user ‘[用户名称]‘‘%‘ identified by ‘[用户密码]‘;--创建用户密码8位以上,包括&#…

Android Studio导出jar包

Eclipse直接有个Export,可以直接导出jar包。AS相对Eclipse变化很大,编译脚本变成了Gradle,各种导包操作都有差异。 下面是AS导出jar的过程: 第一步,修改app下的build.grade。 apply plugin: com.android.application修改为 apply …

GitHub Actions构建镜像并部署服务

目的通过GitHub的Actions来(白嫖)部署.Net服务到阿里云服务器。环境准备需要一个阿里云服务器并且该服务器还安装了docker环境,如果环境安装不清楚可以查看之前的文章。创建镜像仓库在阿里云的容器镜像服务中,创建一个镜像仓库用来存储我们测试的镜像&am…

20165232 缓冲区溢出漏洞实验

缓冲区溢出漏洞实验 实验准备 实验环境需要32位的Linux系统,需要下载安装一些用于编译 32 位 C 程序的软件包,代码如下: $ sudo apt-get update$ sudo apt-get install -y lib32z1 libc6-dev-i386$ sudo apt-get install -y lib32readline-gp…

使用qt的qtcore库怎么包含_GitHub - coologic/QtCoreExamples: QtCore模块相关类库范例

QtCoreExamplesQtCore模块相关类库范例QJsonExampleQt进行Json文件读写范例QXmlExampleQt使用QXmlStreamReader/QXmlStreamWriter类进行XML文件读写范例非不是使用QtXML模块QSharedMemoryExampleQt使用QSharedMemory实现共享内存QSettingsExample(Blog)Qt使用QSettings配置读写…

spfile

1 让ORACLE自己主动从spfile启动 SQL> create spfile/dev/vx/rdsk/vgora/lv_spfile from pfile; SQL> shutdown immediate; 改动initora11g.ora文件 /oracle/app/product/11g/db/dbs cp initora11g.ora initora11g.ora_bak echo SPFILE/dev/vx/rdsk/vgora/lv_spfil…

Atcoder 084D - Small Multiple(最短路径+思维)

分析&#xff1a;这题脑洞新奇...居然是最短路...将0到k-1看做k个点&#xff0c;第t个点向(10*t0,1,2...,9)%k连一条长度为0,,1,2,..,9的边&#xff0c;然后枚举s1,2,...,9,算出所有从s到0的最短路&#xff0c;答案就是最短路s的最小值。 1 #include<iostream>2 #include…

Blazor学习之旅(5)数据绑定

【Blazor】| 总结/Edison Zhou大家好&#xff0c;我是Edison。最近在学习Blazor做全栈开发&#xff0c;因此根据老习惯&#xff0c;我会将我的学习过程记录下来&#xff0c;一来体系化整理&#xff0c;二来作为笔记供将来翻看。本篇&#xff0c;我们来了解下在Blazor中数据是如…

chrome开启touch屏幕点击事件

2019独角兽企业重金招聘Python工程师标准>>> 在chrome浏览器输入 chrome://flags/#top-chrome-md 找到属性 UI Layout for the browsers top chrome 选择Hybrid&#xff0c;重启chrome&#xff0c;如下图&#xff1a; 转载于:https://my.oschina.net/swingcoder/blo…

安卓如何更换wps黑金会员图标_wps图标(手机wps会员图标黑色)

尝试右键文件--打开方式--选择默认程序,选择wps程序,勾选始终以选择的程序打开此文件,确定。如果还是不行的话,请尝试做以下操作:点击桌面左下角开始按钮--在. 在WPS演示中,单击“项目符号”,找到对应的那个即可。在WPS文字中,也是如此。 如题,如何做一个图表,分别表…

Linux服务器重启后crs_stat -t 命令无法正常使用以及解决思路

前提&#xff1a;在Linux系统中安装ASM&#xff0c;安装完ASM和Oracle数据库时都是正常使用的&#xff0c;但在重启服务器后Oracle相关命令不识别。1、[gridudevasm:/home/grid]$crsctl status res -t -bash: crsctl: command not found2、查看环境变量是否正常&#xff0c;命令…

英语十六个时态总结

下面用表格的形式给罗列出来&#xff0c;便于记忆 英语共有十六种时态&#xff0c;其表现形式如下(以study为例)&#xff1a; 一般时 进行时 完成时 完成进行时 现在 studystudies am studyingis studyingare studying have studiedhas studied have been studyinghas …

Python基础--Python3基础语法

Python3 基础语法编码默认情况下&#xff0c;Python3源码文件以UTF-8编码&#xff0c;所有字符串都是Unicode字符串。当然也可以为源码文件指定不同的编码&#xff0c;例如&#xff1a;# -*- coding: cp-1252 -*-标识符1.第一个字符必须是字母表中字母或下划线&#xff1b;2.标…

3 Python os 文件和目录

ile 对象使用 open 函数来创建&#xff0c;下表列出了 file 对象常用的函数&#xff1a; 序号方法及描述1 file.close() 关闭文件。关闭后文件不能再进行读写操作。 2 file.flush() 刷新文件内部缓冲&#xff0c;直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲…