news 2026/4/18 8:42:27

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/18 8:33:53

ResNet18图像分类省钱攻略:云端GPU按需付费,比买显卡省万元

ResNet18图像分类省钱攻略&#xff1a;云端GPU按需付费&#xff0c;比买显卡省万元 1. 为什么你需要云端GPU做图像分类 作为一名自由开发者&#xff0c;你可能经常遇到这样的场景&#xff1a;客户发来一堆产品图片需要分类&#xff0c;但你的笔记本电脑跑个ResNet18模型要半小…

作者头像 李华
网站建设 2026/4/18 3:36:26

ResNet18图像分类傻瓜教程:3步出结果,不用懂代码

ResNet18图像分类傻瓜教程&#xff1a;3步出结果&#xff0c;不用懂代码 引言&#xff1a;美术生的AI小助手 作为一名美术创作者&#xff0c;你是否遇到过这样的困扰&#xff1a;画作越来越多&#xff0c;整理分类却越来越费时间&#xff1f;给每幅作品手动添加标签就像在迷宫…

作者头像 李华
网站建设 2026/4/18 3:32:33

高稳定单目深度估计方案|AI 单目深度估计 - MiDaS镜像优势解析

高稳定单目深度估计方案&#xff5c;AI 单目深度估计 - MiDaS镜像优势解析 &#x1f310; 技术背景&#xff1a;为何需要轻量级、高稳定的单目深度感知&#xff1f; 在计算机视觉的演进历程中&#xff0c;从2D图像理解3D空间结构始终是核心挑战之一。单目深度估计&#xff08;M…

作者头像 李华
网站建设 2026/4/18 3:35:06

Rembg抠图质量评估:客观指标与主观评价

Rembg抠图质量评估&#xff1a;客观指标与主观评价 1. 引言&#xff1a;智能万能抠图 - Rembg 在图像处理和内容创作领域&#xff0c;精准、高效地去除背景是许多应用场景的核心需求。无论是电商商品图精修、社交媒体内容制作&#xff0c;还是AI生成图像的后处理&#xff0c;…

作者头像 李华
网站建设 2026/4/18 3:36:08

AI万能分类器核心优势解析|零样本+可视化WebUI

AI万能分类器核心优势解析&#xff5c;零样本可视化WebUI 在当今信息爆炸的时代&#xff0c;文本数据的自动化处理已成为企业智能化转型的核心需求。无论是工单分类、舆情监控&#xff0c;还是内容打标与意图识别&#xff0c;传统机器学习方法往往依赖大量标注数据和漫长的训练…

作者头像 李华