QML 中宽度、高度与隐式宽度/高度的区别及其应用场景

ops/2024/10/18 11:44:26/

在 QML 中,widthheightimplicitWidthimplicitHeight 这几个属性常常令开发者感到困惑。本文将详细介绍它们之间的区别,并说明在何种情况下应使用隐式尺寸以及普通尺寸。

基本定义

  • widthheight:表示组件/item 的实际尺寸。
  • implicitWidthimplicitHeight:表示组件/item 的自然尺寸,即在未明确指定尺寸时,组件自己希望占用的尺寸。

理解隐式尺寸和实际尺寸

隐式尺寸(Implicit Size)通常在创建可重用组件时使用。它表示组件在未设置明确尺寸时的自然大小。例如,一个图片的自然尺寸是其文件的实际像素大小,但这个尺寸可以被拉伸或缩小。

举例说明

假设我们有一个图片图库,其中的图片大小不一,我们希望这些图片在显示时可以缩小但不放大,此时可以使用隐式宽度和高度来存储图片的自然尺寸:

Image {width: Math.max(150, implicitWidth)height: Math.max(150, implicitHeight)
}

对于自定义组件,可以选择将尺寸定义为相对于组件的根节点,例如:

Item {id: rootRectangle {width: root.width * 0.2height: root.height * 0.2color: 'red'}Rectangle {x: 0.2 * root.widthy: 0.2 * root.heightwidth: root.width * 0.8height: root.height * 0.8color: 'green'}
}

在这种情况下,组件没有自然尺寸,任何设置的尺寸都能完美地适配。

相反,如果我们有一个具有自然尺寸的对象,例如某些固定尺寸的组件:

Item {id: rootproperty alias model: repeater.modelRepeater {id: repeaterdelegate: Rectangle {width: 100height: 100x: 102 * indexy: 102 * index}}
}

在这种情况下,应向用户提供关于自然尺寸的信息,用户可以决定是否设置一个更小的尺寸并处理溢出,例如通过裁剪内容。

隐式尺寸的实际应用

在许多情况下,childrenRect.heightchildrenRect.width 是隐式尺寸的良好度量标准,但也有例外。例如,当内容的 x 坐标为负值时,使用 childrenRect 可能并不合适。

一个实际例子是 Flickable,它专门用于包含比自身尺寸更大的对象。使 Flickable 的尺寸等于其内容的尺寸是不自然的。

注意,在自定义组件中使用 scale 时要小心,因为 childrenRect 不会意识到缩放。

Item {id: rootimplicitWidth: child.width * child.scaleimplicitHeight: child.height * child.scaleRectangle {id: childwidth: 100height: 100scale: 3color: 'red'}
}

实践准则

  1. 当需要设置可重用组件的根节点的尺寸时,使用 implicitWidthimplicitHeight
  2. 在某些情况下,如果节点作为属性暴露出来,也可以为非根节点设置隐式尺寸。
  3. 使用组件时,设置 widthheight

隐式尺寸不是必需的,但它们的存在是为了方便,并成为一种约定。

结论

理解和正确使用 widthheightimplicitWidthimplicitHeight 对于 QML 开发者来说非常重要。隐式尺寸主要在描述组件的自然尺寸时使用,而实际尺寸在组件的布局和显示中更为常见。通过正确使用这些属性,可以创建更灵活和可重用的组件。


http://www.ppmy.cn/ops/52282.html

相关文章

鸿蒙HarmonyOS实战:渲染控制、路由案例

条件渲染 简单来说,就是动态控制组件的显示与隐藏,类似于vue中的v-if 但是这里写法就是用if、else、else if看起来更像是原生的感觉 效果 循环渲染 我们实际开发中,数据一般是后端返回来的对象格式,对此我们需要进行遍历&#…

Word2Vec基本实践

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…

UniApp 开发微信小程序教程(一):准备工作和环境搭建,项目结构和配置

文章目录 一、准备工作和环境搭建1. 安装 HBuilderX步骤: 2. 注册微信开发者账号步骤: 3. 创建 UniApp 项目步骤: 二、项目结构和配置1. UniApp 项目结构2. 配置微信小程序修改 manifest.json修改 pages.json 3. 添加首页文件index.vue 示例&…

人工智能--自然语言处理NLP概述

欢迎来到 Papicatch的博客 目录 🍉引言 🍈基本概念 🍈核心技术 🍈常用模型和方法 🍈应用领域 🍈挑战和未来发展 🍉案例分析 🍈机器翻译中的BERT模型 🍈情感分析在…

EndNote 21 for Mac v21.3 文献管理软件安装

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行安装EndNote212、升级 三、运行1、打开软件,测试 安装完成!!!四、注意事项 效果 一、下载软件 下载软件 链接:http://www.macfxb.cn 二、开始安装 1、双击…

ZCC5429 异步升压芯片

一、产品综述 ZCC5429 芯片是一款自动调频、最高 600KHz 工作频率、高效率、宽输入电压范围的电流模式异步升压(BOOST)芯片,且可调输入限流功能。用户可灵活地通过外部补偿建立动态环路,获得在所有条件下最优瞬态性能。 ZCC5429…

node通过axios调用realworld接口

安装axios pnpm install axios调用Realworld接口 接口文档如下: https://main--realworld-docs.netlify.app/docs/specs/backend-specs/endpoints const axios require(axios); let token const instance axios.create({baseURL: https://api.realworld.io/…

VB.NET 取当前项目根命名空间

VB.NET 取当前项目根命名空间 在VB.NET中,可以使用反射来获取当前程序集的入口点类型(通常是模块或者主类),然后从这个类型的Assembly信息中获取定义它的程序集的根命名空间。以下是一个获取当前项目根命名空间的方法示例&#x…