(十补)自定义布局管理器

【Qt常用控件】—— 布局管理器 布局管理器详解 阅读详情

作者:一去丶二三里 

博客地址:http://blog.youkuaiyun.com/liang19890820

简述

手动布局另一种方法是通过继承QLayout类编写自己的布局管理器。

下面我们详细来举一个例子-QCardLayout。它由同名的Java布局管理器启发而来。也被称之为卡片布局,每个项目偏移QLayout::spacing()。

定义

编写自己的布局,必须定义如下:

  • 一种存储布局处理项目的数据结构,每个项目都是一个QLayoutItem,本例使用QList。

  • addItem() 如何添加项目布局。

  • setGeometry() 如何控制布局。

  • sizeHint() 布局的优选大小。

  • itemAt() 如何遍历布局。

  • takeAt() 如何删除布局中的项目。

大多数情况下,也会实现的minimumSize()。

实现

效果

这里写图片描述

源码

QCardLayoud.h

#ifndef QCARDLAYOUT_H
#define QCARDLAYOUT_H

#include <QWidget>
#include <QLayout>
#include <QLayoutItem>

class QCardLayout : public QLayout
{
public:
    QCardLayout(QWidget *parent = 0);
    ~QCardLayout();
    void addItem(QLayoutItem *item);
    QSize sizeHint() const;
    QSize minimumSize() const;
    int count() const;
    QLayoutItem *itemAt(int) const;
    QLayoutItem *takeAt(int);
    void setGeometry(const QRect &rect);

private:
    QList<QLayoutItem*> list;
};

#endif //QCARDLAYOUT_H
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

QCardLayoud.cpp

#include "QCardLayout.h"

QCardLayout::QCardLayout(QWidget *parent)
    : QLayout(parent)
{

}

// 由于QLayoutItem不继承自QObject,必须手动删除。在析构函数中,使用takeAt()删除列表中的每个项目,然后将其删除。
QCardLayout::~QCardLayout()
{
    QLayoutItem *item;
    while ((item = takeAt(0)))
        delete item;
}

// 获取列表中的项目数
int QCardLayout::count() const
{
    return list.size();
}

// 获取索引idx所对应的项目
QLayoutItem *QCardLayout::itemAt(int idx) const
{
    return list.value(idx);
}

// 移除索引idx所对应的项目,并返回
QLayoutItem *QCardLayout::takeAt(int idx)
{
    return idx >= 0 && idx < list.size() ? list.takeAt(idx) : 0;
}

// 添加项目
void QCardLayout::addItem(QLayoutItem *item)
{
    list.append(item);
}

// 实际控制着布局,作为参数提供的矩形不包括margin()。相关的,使用spacing()作为项目之间的距离。
void QCardLayout::setGeometry(const QRect &r)
{
    QLayout::setGeometry(r);

    if (list.size() == 0)
        return;

    int w = r.width() - (list.count() - 1) * spacing();
    int h = r.height() - (list.count() - 1) * spacing();
    int i = 0;
    while (i < list.size()) {
        QLayoutItem *o = list.at(i);
        QRect geom(r.x() + i * spacing(), r.y() + i * spacing(), w, h);
        o->setGeometry(geom);
        ++i;
    }
}

// sizeHint()和minimumSize()通常非常相似。这两个函数返回的尺寸应包括spacing(),但不包括margin()。
QSize QCardLayout::sizeHint() const
{
    QSize s(0,0);
    int n = list.count();
    if (n > 0)
        s = QSize(100,70);
    int i = 0;
    while (i < n) {
        QLayoutItem *o = list.at(i);
        s = s.expandedTo(o->sizeHint());
        ++i;
    }
    return s + n*QSize(spacing(), spacing());
}

QSize QCardLayout::minimumSize() const
{
    QSize s(0,0);
    int n = list.count();
    int i = 0;
    while (i < n) {
        QLayoutItem *o = list.at(i);
        s = s.expandedTo(o->minimumSize());
        ++i;
    }
    return s + n*QSize(spacing(), spacing());
}
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87

java自定义布局管理器_Java中GUI—布局管理器 在Java的GUI中布局是用来为容器划分区域的,这就决定了控件在容器中的摆放位置,从而为容器规划好分区方式常用的布局管理器有7中:FlowLayout、BorderLayout、GridLayout、BoxLayout、GridBagLayout、CardLayout、在一些顶层容器和面板中,已经规定了默认的布局管理器:javax.swing.JApplet——BorderLayoutjavax.... 阅读详情

相关推荐

Qt 布局管理器

关于布局管理器,它是Qt提供的自动安排子部件位置的东西,布局管理可以为我们节省很多对位置的调节工作。 基本的布局管理器有四种:Horizontal, Vertical, Grid, 和Form 布局管理器。这些在前面的例子都能看到是如何使用的。Qt的帮助文档里也有一个专门讲他们的例子:Basic Layouts。 QHBoxLayout, QVBoxLayout, QGridLayout,和

—— 然 之 9959

Qt之自定义布局管理器(QCardLayout)

简述 手动布局另一种方法是通过继承QLayout类编写自己的布局管理器。 下面我们详细来举一个例子-QCardLayout。它由同名的Java布局管理器启发而来。也被称之为卡片布局,每个项目偏移QLayout::spacing()。 简述 定义 实现 效果 源码 定义 编写自己的布局,必须定义如下: 一种...

weixin_34101229的博客 661

Qt中的takeAt函数的区别

在Qt框架中,takeAt函数是用于从容器中获取并移除指定索引位置的元素。它在不同的容器类中有不同的实现,但其基本功能是相似的。本文将介绍takeAt函数在不同容器类中的使用方法,并提供相应的源代码示例。无论是在QList、QVector还是QLinkedList中,takeAt函数的作用都是获取并移除指定索引位置的元素。但需要注意的是,takeAt函数会改变原始容器的内容,因此在使用时需要谨慎考虑。希望以上内容能对您理解Qt中的takeAt函数有所帮助。Qt中的takeAt函数的区别。

DevAstro的博客 788

Qt编程基础 | 第四章-布局管理器 | 4.1、布局管理器简介

借助布局管理器,无需再逐个调整控件的位置和大小,可以将更多的精力放在软件功能的实现上。

个人技术博客 2562

QT基础教程(布局管理器)

本篇文章我们开始来讲解布局管理器的使用,在界面布局时布局管理器可以说是非常重要的一个存在,有了布局管理器我们就可以让我们的界面变的更加好看。布局管理器(Layout Manager)是一种在图形用户界面(GUI)应用程序中用于自动管理和排列窗口部件(Widget)的工具。布局管理器使得窗口部件能够自适应不同的窗口大小或用户界面布局,从而更好地适应不同的屏幕尺寸和用户需求。在Qt中,提供了多种布局管理器来帮助开发者方便地组织和管理窗口部件。

m0_49476241的博客 1289

自定义布局管理器在Matlab中的实现

然而,有时候我们可能需要创建自定义的布局管理器以满足特定的需求。在该方法中,我们首先计算所有子元素的总宽度和总高度,然后根据间距调整每个子元素的水平位置,最后调整父容器的大小以适应所有子元素。当你运行上述代码时,你会看到三个按钮按照自定义布局管理器的逻辑进行排列,并且父容器的大小会自动调整以适应按钮的位置。通过自定义布局管理器,我们可以更好地控制GUI元素的排列方式,以满足特定的设计需求。首先,我们需要创建一个自定义类来实现布局管理器的功能。然后,我们创建了三个按钮,并将它们添加到布局管理器中。

HackWhisper的博客 135

Swing 自定义布局管理器

Swing开发过程中,或使用一些布局管理器,常用的布局管理器有Borderlayout,Flowlayout,Boxlayout等,当满足不了需求时,我们可以自定义布局管理器。 本示例说明三个空间的位置,使用时,依次添加组件即可: class MapLayout implements LayoutManager {         @Override         public void

文轩以墨 1985

自定义布局管理器在Matlab中的应用

Matlab提供了一些内置的布局管理器,如grid布局和flow布局,但有时候我们需要更灵活的布局方式来满足特定的需求。最后,我们设置每个子元素的位置和大小,使其按照计算得到的位置进行布局。我们可以根据需要定义不同的布局方式,并按照自己的规则来排列和调整界面元素的位置和大小。在本文中,我们将介绍如何使用Matlab来实现一个简单的自定义布局管理器。现在,我们可以使用自定义布局管理器来创建一个自定义布局的用户界面。的类,该类将帮助我们在Matlab中实现自定义的布局方式。在上述代码中,我们定义了一个名为。

2301_79326857的博客 212

(十)布局管理器

绝对定位(直接在像素级指定各组件的位置与大小)有一些缺点: 1、对于某些平台,窗口部件的大小可能并不合适(无法自适应父窗口的变化) 2、位置与大小需要人工计算,难以维护   布局管理器 提供相关类对界面组件进行布局管理 使用布局管理器: 1、任意容器类的组件都可以指定布局管理器 2、能够自动排列窗口中的界面组件 3、窗口变化后自动更新界面组件的大小 此处组件1与组件

早起的虫儿灬 1081

QT5 卡片布局(QLayout)

QT5实现的卡片布局,基于QLayout的CardStackLayout,实现动画效果。

【SABRE 3D, SABRE 3DxT,LAM设备】2025年9月14日-Clamshell 拆卸与安装

Clamshell 拆卸与安装。

weixin_46735260的博客 1690

java布局管理器定义_JAVA布局管理器小结(八)自定义布局管理器

Java除了预定的布局管理器,以及不使用布局管理器,还为绝世高手提供了自定义的布局管理器。Java为自定义布局管理器提供了接口LayoutManager和LayoutManager2两中接口,以实现自定义的布局管理器。其中LayoutManager2继承了LayoutManager。Java预定义的六种布局管理器就是对两种接口的实现,查看源码,这六种布局管理器的实现分布如下:LayoutManag...

weixin_39860108的博客 451

医疗大模型实战——从零构建MedicalGPT全流程解析

本文详细解析了从零构建医疗大模型MedicalGPT的全流程实战。基于Qwen-7B模型与约195万条中文医疗数据,完整复现了增量预训练、监督微调与偏好对齐三大核心环节,并分享了如何在有限硬件资源下实现高效训练与部署,为开发者提供了可复现的医疗AI项目实战指南。

weixin_29193259的博客 553

自定义布局管理器

要编写自定义布局管理器,需要从QLayout类派生,并定义如下一些方法和数据结构: 存储布局管理器上每个项的数据结构,每个项是一个QLayoutItem。 addItem(),定义怎样将每个项添加到布局管理器上。 setGeometry(),怎样执行布局。 s...

chijiandao3197的博客 189

Win10系统蓝屏错误BAD SYSTEM CONFIG INFO的解决方案

BAD SYSTEM CONFIG INFO错误是Win10系统中较为常见的一种蓝屏错误,通常与系统配置文件损坏或丢失有关。本文介绍了三种有效的解决方法:使用系统修复高级选项修复、通过PE修复文件和重装新系统。用户可以根据实际情况选择合适的方法进行操作。同时,建议用户定期备份系统重要文件和数据,以防止类似问题的发生。在遇到问题时,保持冷静并耐心操作,通常可以顺利解决问题。

mmoo_python的博客 7725

DreamerV3实战:如何用世界模型在Minecraft中自动挖钻石(附完整训练流程)

本文详细介绍了如何使用DreamerV3世界模型在Minecraft中训练AI智能体自动完成挖钻石的复杂任务。文章深入分析了该任务对强化学习的挑战,提供了从环境配置、模型训练到结果评估的完整实战流程,并分享了关键的调优技巧与问题解决方案,展示了基于模型的强化学习在解决稀疏奖励问题上的强大能力。

weixin_29050271的博客 192

创建自定义布局管理器

本次编写小编只是为了说明如何自定义创建布局管理器,所以只是简单举例。 首先自定义的布局管理器要继承LayoutManager 接口,然后实现借口里的方法,接着的布局只需在layoutContainer(Cotainer parent)编写就行 自定义布局类: import java.awt.*; import java.io.Serializable; class textLayout impl...

二月鸟 482

从FER2013到AffectNet:表情识别数据集十年演进史与你的项目选型攻略

本文回顾了从FER2013到AffectNet等主流人脸表情识别数据集的十年演进历程,详细分析了各数据集的特点、适用场景及技术突破。针对不同项目需求,提供了从移动端应用到高精度研究的选型策略,特别强调AffectNet在现代FER项目中的核心价值,并给出混合数据集构建的实战方案。

weixin_26808439的博客 522

Qt 之自定义布局管理器(QCardLayout)

手动布局另一种方法是通过继承QLayout类编写自己的布局管理器。

青春不老,奋斗不止! 1万+

火车头采集器超级详细图文使用指导(面向新手)

火车采集器·超级详细使用指导

DE的个人原创笔记 1万+

【docker】第10篇 Failed with result ‘exit-code和Start request repeated too quickly和Failed to start Docker

【docker】解决 Failed with result 'exit-code'和Start request repeated too quickly和Failed to start Docker。

Fanjufei的博客 6819

Qt-实现自定义的布局管理器(同时浅浅地探究布局实现的原理)

探究Qt中布局管理器之所以能对子Widget进行“布局”的原理,同时探讨如何实现自定义的布局管理器。

A_zyx0808的博客 1062

【专栏必读】王道考研408数据结构+算法设计与分析万字笔记使用说明及章节导航

各位老铁思维导图在我整理完笔记后会放上去的,我需要根据王道的思维导图重新再做一遍 文章目录一:有关注意事项二:关于专栏三:学习建议四:各专栏导航(各位老铁别催,质量优先)(1)第一章:绪论(2)第二章:线性表(3)第三章:栈和队列第四章:串第五章:二叉树第六章:图 首先感谢王道大大(手动比心),很用心在做了,大家可以看其中两节是否符合胃口 (王道408考研数据结构)第五章树-第三节1:二叉树遍历(先序、中序和后序) (王道408考研数据结构)第五章树-第四节2:平衡二叉树(AVL)及其旋转 一:有.

快乐江湖的博客 5万+

Qt——布局管理器

Qt——布局管理器

m0_73443478的博客 3065

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java GridLayout(网格布局)布局管理器

GridLayout(网格布局) ​ GridLayout 布局管理器将容器分割成纵横线分隔的网格 , 每个网格所占的区域大小相同。当向使用 GridLayout 布局管理器的容器中添加组件时, 默认从左向右、 从上向下依次添加到每个网格中 。 与 FlowLayout不同的是,放置在 GridLayout 布局管理器中的各组件的大小由组件所处的区域决定(每 个组件将自动占满整个区域) 。 构造方法 方法功能 GridLayout(int rows,in t cols) 采用指

ruan_luqingnian的博客 3万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

上一篇: (三十)自定义事件
下一篇: (三十一)Qt中的调色板QPalette
早起的虫儿灬
博客等级 码龄10年 54粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值