提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|使用教程|编辑:龚雪|2022-05-12 10:27:17.097|阅读 165 次
概述:本文主要为大家介绍Qt 布局系统中的布局管理功能,欢迎大家下载相关组件体验!
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
相关链接:
Qt布局系统提供了一种简单而强大的方式来自动排列小部件内的子小部件,以确保它们充分利用可用空间。
Qt技术交流群:166830288 欢迎一起进群讨论
如果您正在制作独一无二的特殊布局,还可以制作如前几篇文章所述的自定义小部件,重新实现 ()来计算所需的尺寸分布并在每个子集上调用()。
当需要重新计算布局时,小部件将获得 类型的事件,重新实现 () 来处理 事件。
手动布局的替代方法是通过继承来编写自己的布局管理器,边框布局和流布局示例展示了如何执行此操作。
这里我们详细介绍一个例子。CardLayout 类的灵感来自同名的 Java 布局管理器,它将项目(小部件或嵌套布局)放在彼此的顶部,每个项目由 ()偏移。
要编写自己的布局类,您必须定义以下内容:
在大多数情况下,您还将实现 ()。
Header File (card.h)
#ifndef CARD_H #define CARD_H #include <QtWidgets> #include <QList> class CardLayout : public QLayout { public: CardLayout(int spacing): QLayout() { setSpacing(spacing); } CardLayout(int spacing, QWidget *parent): QLayout(parent) { setSpacing(spacing); } ~CardLayout(); void addItem(QLayoutItem *item) override; QSize sizeHint() const override; QSize minimumSize() const override; int count() const override; QLayoutItem *itemAt(int) const override; QLayoutItem *takeAt(int) override; void setGeometry(const QRect &rect) override; private: QList<QLayoutItem *> m_items; }; #endif
Implementation File (card.cpp)
//#include "card.h"
首先我们定义 count() 来获取列表中的项目数。
int CardLayout::count() const { // QList::size() returns the number of QLayoutItems in m_items return m_items.size(); }
然后我们定义了两个遍历布局的函数:itemAt() 和 takeAt()。 布局系统内部使用这些函数来处理小部件的删除,它们也可供应用程序程序员使用。
itemAt() 返回给定索引处的项目,takeAt() 删除给定索引处的项目,并将其返回。 在这种情况下,我们使用列表索引作为布局索引。 在我们有更复杂的数据结构的其他情况下,可能需要花费更多的精力来定义项目的线性顺序。
QLayoutItem *CardLayout::itemAt(int idx) const { // QList::value() performs index checking, and returns nullptr if we are // outside the valid range return m_items.value(idx); } QLayoutItem *CardLayout::takeAt(int idx) { // QList::take does not do index checking return idx >= 0 && idx < m_items.size() ? m_items.takeAt(idx) : 0; }
addItem() 实现布局项的默认放置策略,必须实现此功能。 它由 QLayout::add() 使用,由将布局作为父级的 构造函数使用。如果您的布局具有需要参数的高级放置选项,则必须提供额外的访问函数,例如 ()、()和 () 的跨行和跨列重载。
void CardLayout::addItem(QLayoutItem *item) { m_items.append(item); }
布局接管添加的项目的责任,由于不继承 ,我们必须手动删除项目。 在析构函数中,使用 takeAt() 从列表中删除每个项目,然后将其删除。
CardLayout::~CardLayout() { QLayoutItem *item; while ((item = takeAt(0))) delete item; }
setGeometry() 函数实际上执行布局,作为参数提供的矩形不包括 margin()。 如果相关,请使用 spacing() 作为项目之间的距离。
void CardLayout::setGeometry(const QRect &r) { QLayout::setGeometry(r); if (m_items.size() == 0) return; int w = r.width() - (m_items.count() - 1) * spacing(); int h = r.height() - (m_items.count() - 1) * spacing(); int i = 0; while (i < m_items.size()) { QLayoutItem *o = m_items.at(i); QRect geom(r.x() + i * spacing(), r.y() + i * spacing(), w, h); o->setGeometry(geom); ++i; } }
sizeHint() 和 minimumSize() 在实现上通常非常相似,两个函数返回的尺寸都应该包括spacing(),但不包括margin()。
QSize CardLayout::sizeHint() const { QSize s(0, 0); int n = m_items.count(); if (n > 0) s = QSize(100, 70); //start with a nice default size int i = 0; while (i < n) { QLayoutItem *o = m_items.at(i); s = s.expandedTo(o->sizeHint()); ++i; } return s + n * QSize(spacing(), spacing()); } QSize CardLayout::minimumSize() const { QSize s(0, 0); int n = m_items.count(); int i = 0; while (i < n) { QLayoutItem *o = m_items.at(i); s = s.expandedTo(o->minimumSize()); ++i; } return s + n * QSize(spacing(), spacing()); }
Qt技术交流群:166830288 欢迎一起进群讨论
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn
文章转载自:慧都网本文探讨 SQL Server 中 NULL 和空值之间的区别,并讨论如何有效地处理它们。
Unity 是一款功能极其丰富的游戏引擎,允许开发人员将各种媒体集成到他们的项目中。但是,它缺少最令人兴奋的功能之一 - 将 Web 内容(例如 HTML、CSS 和 JavaScript)直接渲染到 3D 场景中的纹理上的能力。在本文中,我们将介绍如何使用 DotNetBrowser 在 Unity3D 中将 Web 内容渲染为纹理。
DevExpress v24.2帮助文档正式发布上线了,请按版本按需下载~
本教程将向您展示如何用MyEclipse构建一个Web项目,欢迎下载最新版IDE体验!
一个跨平台的C++图形用户界面应用程序开发框架。
QtitanRibbon专业全面 & 实现Qt技术的跨平台Ribbon UI组件
QtitanChart性能优异的跨平台Qt类图表组件
QtitanDataGrid一个独特的Qt开发框架产品,吸收了Delphi、C++以及其他语言的优点
QtitanDocking一个用于允许创建类似于Microsoft可停靠用户界面的Qt框架组件。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@cahobeh.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢