news 2026/4/12 2:37:01

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/10 5:48:12

Rembg部署监控:服务健康检查与报警设置

Rembg部署监控&#xff1a;服务健康检查与报警设置 1. 引言 1.1 智能万能抠图 - Rembg 在图像处理和内容创作领域&#xff0c;自动去背景技术已成为提升效率的核心工具之一。Rembg 作为一款基于深度学习的开源图像分割工具&#xff0c;凭借其强大的 U-Net 模型架构&#xff…

作者头像 李华
网站建设 2026/4/10 18:37:40

ResNet18物体检测避坑指南:云端GPU免踩坑,2块钱试效果

ResNet18物体检测避坑指南&#xff1a;云端GPU免踩坑&#xff0c;2块钱试效果 1. 为什么选择ResNet18做毕业设计&#xff1f; 作为一名即将毕业的本科生&#xff0c;你可能正在为毕设的物体检测任务发愁。ResNet18作为经典的卷积神经网络&#xff0c;特别适合毕业设计这类中小…

作者头像 李华
网站建设 2026/4/10 16:46:23

ResNet18保姆级教程:10分钟部署物体识别,小白零失败

ResNet18保姆级教程&#xff1a;10分钟部署物体识别&#xff0c;小白零失败 1. 为什么选择ResNet18做物体识别&#xff1f; 想象你刚拿到一部新手机&#xff0c;需要快速识别相册里的照片是猫还是狗。ResNet18就像手机里的"智能相册分类"功能&#xff0c;只不过它更…

作者头像 李华
网站建设 2026/4/10 12:06:11

用Cursor免费版快速开发一个天气查询应用

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个天气查询应用&#xff0c;使用Cursor免费版的AI辅助功能完成以下步骤&#xff1a;1. 通过API获取实时天气数据&#xff1b;2. 处理并显示天气信息&#xff1b;3. 添加城市…

作者头像 李华
网站建设 2026/4/3 2:48:54

用AI快速开发REACT和VUE的区别应用

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个REACT和VUE的区别应用&#xff0c;利用快马平台的AI辅助功能&#xff0c;展示智能代码生成和优化。点击项目生成按钮&#xff0c;等待项目生成完整后预览效果 最近在学前端…

作者头像 李华