【QT】——布局

news2024/9/24 13:20:57

目录

1.在UI窗口中布局

 2.API设置布局

2.1 QLayout

2.2 QHBoxLayout

2.3 QVBoxLayout

2.4 QGirdLayout 

注意

 示例


Qt 窗口布局是指将多个子窗口按照某种排列方式将其全部展示到对应的父窗口中的一种处理方式。在 Qt 中常用的布局样式有三种,分别是:

  • 水平布局:布局中的所有的控件水平排列
  • 垂直布局:布局中的所有的控件垂直排列
  • 栅格布局:布局中的所有的控件垂直 + 水平排列

1.在UI窗口中布局

在UI界面中找到对应的布局窗口。

将相应的控件放入到布局对应的红色框内部,这些控件就按照布局的样式自动排列到一起了

布局的注意事项:

通过 UI 编辑窗口的树状列表我们可以对所有窗口的布局进行检查如果发现某个窗口没有布局,一定要对其进行设置如果某个窗口没有进行布局, 那么当这个窗口显示出来之后里边的子部件就可能无法被显示出来。

方式2:

 

 

布局属性:

 布局与窗口是有间隙的,上面的属性是描述窗口与布局之间的上下左右的属性。

layoutSpacing是描述布局内控件的间隙

 

 

 2.API设置布局

在 QT 中,布局也有对应的类,布局类之间的关系如下:

常用的布局类:

  • 水平布局:GHBoxLayout
  • 垂直布局:GVBoxLayout
  • 栅格布局:QGridLayout

一般我们不使用这些布局类对窗口进行布局,但是在这里还是给大家介绍一下这些类中常用的一些 API 函数

2.1 QLayout

// 在布局最后面添加一个窗口
void QLayout::addWidget(QWidget *w);
// 将某个窗口对象从布局中移除, 窗口对象如果不再使用需要自己析构
void QLayout::removeWidget(QWidget *widget);
// 设置布局的四个边界大小, 即: 左、上、右和下的边距。
void QLayout::setContentsMargins(int left, int top, int right, int bottom);
// 设置布局中各个窗口之间的间隙大小
void setSpacing(int);

2.2 QHBoxLayout

 这个类中的常用 API 都是从基类继承过来的,关于其使用,实例代码如下:

   
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    //在QMaindow布局
    ui->setupUi(this);
    QWidget* w=new QWidget;
    setCentralWidget(w);

    QHBoxLayout* hlayout=new QHBoxLayout;
    QPushButton* b1=new QPushButton("1");
    QPushButton* b2=new QPushButton("2");
    QPushButton* b3=new QPushButton("3");

    hlayout->addWidget(b1);
    hlayout->addWidget(b2);
    hlayout->addWidget(b3);

    centralWidget()->setLayout(hlayout);
}

2.3 QVBoxLayout

这个类中的常用 API 都是从基类继承过来的,关于其使用,实例代码如下:


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QWidget* w=new QWidget;
    setCentralWidget(w);

    QVBoxLayout* hlayout=new QVBoxLayout;
    QPushButton* b1=new QPushButton("1");
    QPushButton* b2=new QPushButton("2");
    QPushButton* b3=new QPushButton("3");

    hlayout->addWidget(b1);
    hlayout->addWidget(b2);
    hlayout->addWidget(b3);

    centralWidget()->setLayout(hlayout);
}

 

2.4 QGirdLayout 

// 构造函数
QGridLayout::QGridLayout();
QGridLayout::QGridLayout(QWidget *parent);

// 添加窗口对象到网格布局中
/*
参数:
  - widget: 添加到布局中的窗口对象
  - row: 添加到布局中的窗口对象位于第几行 (从0开始)
  - column: 添加到布局中的窗口对象位于第几列 (从0开始)
  - alignment: 窗口在布局中的对齐方式, 没有特殊需求使用默认值即可
*/
void QGridLayout::addWidget(
	QWidget *widget, int row, int column, 
Qt::Alignment alignment = Qt::Alignment());

/*
参数:
  - widget: 添加到布局中的窗口对象
  - fromRow: 添加到布局中的窗口对象位于第几行 (从0开始)
  - fromColumn: 添加到布局中的窗口对象位于第几列 (从0开始)
  - rowSpan: 添加的窗口从 fromRow 行开始跨越的行数
  - columnSpan: 添加的窗口从 fromColumn 列开始跨越的列数
  - alignment: 窗口在布局中的对齐方式, 没有特殊需求使用默认值即可
*/
void QGridLayout::addWidget(
QWidget *widget, int fromRow, int fromColumn, 
int rowSpan, int columnSpan, 
Qt::Alignment alignment = Qt::Alignment());

// 设置 column 对应的列的最新宽度, 单位: 像素
void QGridLayout::setColumnMinimumWidth(int column, int minSize);

// 设置布局中水平方向窗口之间间隔的宽度
void QGridLayout::setHorizontalSpacing(int spacing);

// 设置布局中垂直方向窗口之间间隔的宽度
void QGridLayout::setVerticalSpacing(int spacing);

注意

 在MainWindow并不能直接进行布局。不然会显示QWidget::setLayout: Attempting to set QLayout "" on MainWindow这个错误。

解决:

    1.创建一个QWidget的实例,并将这个实例设置为centralWidget。

     QWidget *widget = new QWidget();
     this->setCentralWidget(widget);

   2. 进行布局 。

    QHBoxLayout *hbLayout = new QHBoxLayout();
    hbLayout->addWidget(m_openButton);
    hbLayout->addWidget(m_closeButton);

 3.只需要将widget的布局设置为布局就好了

   centralWidget()->setLayout(hbLayout);

 
示例

使用UI界面设计一个登录窗口。

 

改进:

将登录界面放在中间

第一种方式:设置属性

点击右侧的属性,找到alignment->水平布局->选择AlignCenter

 

 第二种方式:添加弹簧

 

 

 

最后,在设置窗口为固定:

 记住宽度和高度,将窗口设置为固定大小。

setFixedSize(419.350);

最终显示效果:

 

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

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

相关文章

CRM 软件如何帮助企业改善营销活动?

一场富有成效的营销活动,是在正确的时间将正确的信息传递到正确的受众面前。为此,你必须充分了解对潜在客户和现有客户的需求,然后创建满足这些需求的营销活动。 CRM 软件和工具可以帮助营销团队收集和分析受众数据,以建立更有效的…

如何在Windows的优化驱动器工具中优化驱动器

​优化硬盘是提高电脑性能的最佳方法之一。Windows 包括一些功能,可以帮助优化电脑目前使用的不同类型的驱动器。无论你的电脑使用哪种类型的驱动器,Windows 都会自动选择适合你的驱动器的优化。 默认情况下,优化驱动器(以前称为磁盘碎片整理程序)会在自动维护中设置的时…

6.2.3 网络基本服务---文件传输协议(FTP)

6.2.3 网络基本服务—文件传输协议(FTP) FTP(File Transfer Protocol)是Internet上使用最为广泛的文件传送协议,FTP提供交互式的访问,允许客户上传文件到服务器或者从服务器下载文件,FTP屏蔽了…

Hive(19):DML之Insert插入数据

1 背景:RDBMS中insert使用(insert+values) 在MySQL这样的RDBMS中,通常是insert+values的方式来向表插入数据,并且速度很快。这也是RDBMS中插入数据的核心方式。 INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN ); 假如说对Hiv…

朝花夕拾 - 编程马拉松!Coding 40h,着手 AI 展望未来

眼看时间已过半,回忆唏嘘难忘怀。 Hello 大家好,我是爱折腾的前端工程师 jsliang~ 2023 过得很快,眼瞅着加加班已去大半年,一边恨自己没赶上今年大热门,一边蒙头睡觉恢复体力并感叹精神不如初。 在我以为潮流箭步离我而…

连通域与相距变换

1、连通域 //连通域 int test1() {//对图像进行距离变换Mat img imread("F:/testMap/rice.png");if (img.empty()){cout << "请确认图像文件名称是否正确" << endl;return -1;}Mat rice, riceBW;//将图像转成二值图像&#xff0c;用于统计连通…

王道考研数据结构第五章知识点

5.1.1 树的定义和基本术语 祖先节点&#xff1a;(对于你来说),父亲和爷爷都是祖先节点 子孙节点&#xff1a;对于父亲来说&#xff0c;父亲下面所有的节点都叫子孙节点 双亲节点(父节点)&#xff1a;一个节点的直接前驱就是它的父节点 兄弟节点&#xff1a;例如二叔&#xf…

MYSQL定义及操作

1、显示所有职工的基本信息 2、查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号 3、求出所有职工的人数 4、列出最高工和最低工资 5、列出职工的平均工资和总工资 6、创建一个只有职工号、姓名和参加工作的新表&#xff0c;名为工作日期表 7、显示所有女职工的年龄…

jvm新生代调优

5-4 新生代调优 只有排除了自己代码的问题后&#xff0c;再进行内存调优&#xff0c;内存调优都是从新生代开始&#xff0c;因为新生代优化空间更大一些 新生代的特点 所有的new操作分配内存都是非常廉价的&#xff0c;非常快 TLAB&#xff1a;thread-local allocation buf…

go-zero微服务实战——服务构建

目录介绍 接上一节go-zero微服务实战——基本环境搭建。搭建好了微服务的基本环境&#xff0c;开始构建整个微服务体系了&#xff0c;将其他服务也搭建起来。 order的目录结构&#xff0c;如下 根目录 api服务rpc服务自定义逻辑层logic自定义参数层models自定义工具层util …

RAR Extractor Max - Unzip for Mac(简单易用的压缩软件)

RAR Extractor Max是一个软件应用程序&#xff0c;旨在从RAR档案中提取文件。RAR是一个流行的归档文件解压软件&#xff0c;广泛用于压缩和归档文件。RAR Extractor Max是专门为处理RAR文件而设计的&#xff0c;对于任何经常处理这种文件格式的人来说&#xff0c;这是一个有用的…

【运维工程师学习四】Web服务之Apache

【运维工程师学习四】Web服务之Apache 1、查询、安装apacherpm命令使用 2、验证httpd是否启动成功&#xff08;1&#xff09;、查看是否有httpd的进程&#xff08;2&#xff09;、查看是否有80端口在监听中&#xff08;3&#xff09;、CentOS7默认不带netstat命令&#xff0c;通…

自定义TagViewGroup

来看看如何实现最最基本的TagGroupView&#xff0c;该视图作为ViewGroup的作用是实现其中的子视图的自动换行&#xff0c;保证子视图能够按照在xml中传入的顺序来相对合理地显示到界面上。 注意&#xff1a;其实在Android技术已经非常完善的当下&#xff0c;其实我们已经不怎么…

【k8s】k8s的yaml文件解释,如何部署一个java.jar包

前言&#xff1a; k8s的yaml文件解释&#xff0c;如何部署一个java,jar包 YAML语法格式&#xff1a; 大小写敏感&#xff1b;使用缩进表示层级关系&#xff1b;不支持Tab键制表符缩进&#xff0c;只使用空格缩进&#xff1b;缩进的空格数目不重要&#xff0c;只要相同层级的元…

Imx6ull linux 设备树

一 linux设备树简介 1.1 linux设备树 Linux设备树是一种用于描述硬件设备信息的数据结构&#xff0c;它在Linux内核中发挥着越来越重要的作用 在系统上电后&#xff0c;BootLoader会将设备树传递给Linux内核&#xff0c;内核根据识别的树信息展开为platform_device、spi_dev…

如何用爬虫实现GPT功能

如何用爬虫实现GPT功能&#xff1f; GPT&#xff08;Generative Pre-trained Transformer&#xff09;和爬虫是两个完全不同的概念和技术。GPT是一种基于Transformer模型的自然语言处理模型&#xff0c;用于生成文本&#xff0c;而爬虫是一种用于从互联网上收集数据的技术。 …

贝叶斯 A/B 测试解释与Python实现

一、说明 A / B测试在各个行业中有许多应用。从试图确定最佳市场群体到医疗药物测试&#xff0c;它具有各种应用&#xff0c;并允许企业根据结果做出决策。有两种常见的A/B检验方法&#xff0c;频率主义方法和贝叶斯方法&#xff0c;两者都是从假设检验的基础出发的。在本文中&…

819. 递归求阶乘

链接&#xff1a; 819.递归求阶乘 题目&#xff1a; 请使用递归的方式求 nn 的阶乘。 输入格式 共一行&#xff0c;包含一个整数 nn。 输出格式 共一行&#xff0c;包含一个整数&#xff0c;表示 nn 的阶乘的值。 数据范围 1≤n≤101≤n≤10 输入样例&#xff1a; 3输出样例&am…

【Linux】查看系统各种信息的常用命令 (CPU、内存、进程、网口、磁盘、硬件、等等)

Linux是一种开源的类Unix操作系统&#xff0c;它有很多不同的发行版&#xff0c;如Ubuntu、CentOS、Debian等。Linux系统提供了很多命令行工具&#xff0c;可以让用户方便地查看和管理系统的各种信息&#xff0c;如硬件配置、内存使用、进程状态、网络连接等。本文将介绍一些常…

解决IDEA项目external libraries依赖包消失的问题

有时候电脑重启后&#xff0c;再打开IDEA上的项目时会出现external libraries目录下的依赖包都消失了的情况&#xff0c;只剩下了一个JDK的包 网上说可以通过刷新IDEA的缓存解决&#xff0c;但我试了没有效果&#xff0c;最后使用如下办法解决&#xff1a; 1.删除项目目录下的…