news 2026/4/28 0:42:06

CardLayout 实现自定义布局

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CardLayout 实现自定义布局

自定义卡片布局CardLayout,这个布局是官方用来介绍怎么实现一个自定义布局的示例。

自定义布局第一步就是要继承QLayout 然而QLayout却是个抽象类,有几个纯虚函数必须要是实现下:

virtual void addItem(QLayoutItem *item) = 0 //向布局中添加控件 virtual int count() const = 0 //布局中控件数量 virtual QLayoutItem *itemAt(int index) const = 0 //根据下标获取控件 virtual QLayoutItem *takeAt(int index) = 0 //根据下标移除控件 virtual QSize sizeHint() const = 0 //默认大小

这些还都只是对布局中子控件管理的功能,真正处理控件布局位置的函数却是:

virtual void setGeometry(const QRect&) = 0

CardLayout 实现

接下来进入主题,看下这些函数都是怎么实现的,类定义:

class CardLayout : public QLayout { Q_OBJECT public: CardLayout(QWidget *parent = nullptr); ~CardLayout(); void addItem(QLayoutItem *item) override; int count() const override; QLayoutItem *itemAt(int) const override; QLayoutItem *takeAt(int) override; QSize sizeHint() const override; void setGeometry(const QRect &rect) override; private: QList<QLayoutItem*> list; };

对于子控件的管理用的是QList<QLayoutItem*>,简单直接。

成员函数实现:

CardLayout::CardLayout(QWidget *parent): QLayout(parent) {} CardLayout::~CardLayout() { QLayoutItem *item; while ((item = takeAt(0))) delete item; } void CardLayout::addItem(QLayoutItem *item) { list.append(item); } int CardLayout::count() const { return list.count(); } QLayoutItem *CardLayout::itemAt(int idx) const { return list.value(idx); } QLayoutItem *CardLayout::takeAt(int idx) { return idx >= 0 && idx < list.size() ? list.takeAt(idx) : 0; } QSize CardLayout::sizeHint() const { return QSize(0,0); } void CardLayout::setGeometry(const QRect &rect) { QLayout::setGeometry(rect); if(list.size() == 0) return; int w = rect.width() - (list.count() - 1)*spacing(); int h = rect.height() - (list.count() - 1)* spacing(); int i = 0; while (i < list.size()) { QLayoutItem *o = list.at(i); QRect geom(rect.x() + i*spacing(), rect.y() + i*spacing(), w, h); o->setGeometry(geom); ++i; } }

sizeHint这里是直接给0,暂且也不需要它发挥作用。
看过setGeometry的实现后,这个自定义的卡片布局的就很清晰了,每个子控件就是向右下角依次做个偏移显示而已。

调用示例

CardLayout * lay = new CardLayout; for(int i=0; i<5; i++) { lay->addItem( new QWidgetItem(new QPushButton(QString::number(i+1))) ); } this->setLayout(lay);

弄了5个按钮来试试这新实现的卡片布局。看下效果:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 21:31:40

Logo提取神器:Rembg抠图部署与使用教程

Logo提取神器&#xff1a;Rembg抠图部署与使用教程 1. 引言 1.1 智能万能抠图 - Rembg 在图像处理、品牌设计和电商运营中&#xff0c;快速精准地提取Logo或主体对象是一项高频且关键的需求。传统手动抠图耗时费力&#xff0c;而基于AI的自动去背景技术正成为主流解决方案。…

作者头像 李华
网站建设 2026/4/25 20:08:23

ResNet18模型详解+云端实战:理论实践结合,1元体验

ResNet18模型详解云端实战&#xff1a;理论实践结合&#xff0c;1元体验 1. 为什么选择ResNet18作为入门模型 当你刚开始学习深度学习时&#xff0c;可能会被各种复杂的网络结构搞得晕头转向。ResNet18就像是一个"恰到好处"的入门选择——它足够简单让你理解基本原…

作者头像 李华
网站建设 2026/4/26 22:47:29

Rembg模型轻量化:移动端部署方案探索

Rembg模型轻量化&#xff1a;移动端部署方案探索 1. 引言&#xff1a;智能万能抠图 - Rembg 在图像处理与内容创作领域&#xff0c;自动去背景是一项高频且关键的需求。无论是电商商品图精修、社交媒体头像设计&#xff0c;还是AR/VR内容生成&#xff0c;精准的前景提取能力都…

作者头像 李华
网站建设 2026/4/25 7:44:14

Rembg模型比较:与商业软件的优劣分析

Rembg模型比较&#xff1a;与商业软件的优劣分析 1. 引言&#xff1a;智能万能抠图 - Rembg 在图像处理领域&#xff0c;背景去除&#xff08;Image Matting / Background Removal&#xff09;是一项高频且关键的任务。无论是电商产品图精修、社交媒体内容创作&#xff0c;还…

作者头像 李华
网站建设 2026/4/23 23:59:45

AI 单目深度估计 - MiDaS镜像详解|快速部署WebUI版深度感知应用

AI 单目深度估计 - MiDaS镜像详解&#xff5c;快速部署WebUI版深度感知应用 &#x1f310; 技术背景&#xff1a;从2D图像理解3D空间 在计算机视觉领域&#xff0c;单目深度估计&#xff08;Monocular Depth Estimation&#xff09; 是一项极具挑战性但又至关重要的任务。它旨…

作者头像 李华
网站建设 2026/4/23 14:42:57

AWAZLIKHAYAXORAX:一个神秘词汇的实际应用场景

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 设计一个应用&#xff0c;模拟AWAZLIKHAYAXORAX在密码学或品牌命名中的使用。用户可以输入该词汇&#xff0c;系统生成可能的加密代码或品牌标识建议。应用应包含可视化展示&#…

作者头像 李华