【QT Quick】基础语法:导入外部QML文件

在实际项目中,代码通常分为多个文件进行模块化管理,这样可以方便代码重用,例如统一风格或共享功能模块。我们将在此部分学习如何创建 QML 项目,并演示如何访问外部代码,包括其他 QML 文件、库文件以及 JS 代码。

准备开发环境

在开发环境方面,我们尽量只使用纯 QML,不结合 C++,这样就可以避免频繁编译。建议使用以下两种工具之一进行开发:

  • VS Code + 命令行:可以通过命令行来执行 QML 文件。

  • Qt Creator:在课程中,我们选择使用 Qt Creator 来创建项目。Qt Creator 提供了 Qt Quick UI 原型系统,用于快速验证 QML 语法。以下是使用 Qt Creator 创建项目的步骤:

    • 打开 Qt Creator,选择创建一个 “Qt Quick 项目”(即 UI 原型系统),该类型的项目不需要 C++ 代码。

    • 确定项目配置,如 SDK 和工具链设置。

    • 项目创建后,生成了一个默认的 QML 项目结构,包括入口文件 main.qml

访问同一目录下的文件

在 QML 项目中,如果我们希望引用同一目录下的其他 QML 文件,可以通过以下方式实现:

  • 文件名必须以大写字母开头。
  • 直接使用文件名作为类型名,不需要导入(import)任何内容。

创建新的 QML 文件

  • 在项目目录下创建一个新文件,命名为 MyType.qml(文件名首字母必须大写)。

  • MyType.qml 中定义内容,例如:

    // MyType.qml
    import QtQuick 2.0Text {text: "MyType Text"
    }
    

    这里我们创建了一个简单的 Text 元素,以便验证文件是否被成功调用。

在主 QML 文件中使用自定义类型

在主 QML 文件(如 main.qml)中使用自定义类型 MyType

import QtQuick 2.0Rectangle {width: 400height: 400MyType {anchors.centerIn: parentx: 100y: 50}
}
  • 这里我们直接使用 MyType,将其作为一个组件插入到主界面中。
  • 可以对自定义类型的属性进行调整,例如位置 xy,或者使用 anchors 进行布局。

验证结果

运行项目时,您应该会看到自定义类型 MyTypeText 显示在界面上。这样就成功演示了如何在同一目录下访问其他 QML 文件。

访问外部文件

在 QML 中,可以使用 import 关键字访问外部库。这种方式非常类似于 C++20 及其他现代编程语言中导入外部模块的方式。我们将在这一章节中了解如何导入 QML 系统库以及自定义库,并讨论可能遇到的命名冲突问题。

import 语法

在 QML 中导入外部库时,通常需要指定库的名称、版本号以及可选的命名空间标识符 as。其一般格式如下:

import 库名称 版本号 as 命名空间

例如,以下代码导入了 QtQuick 库的 6.0 版本:

import QtQuick 6.0

库的名称与版本号

  • 库名称:导入的库名称可以是系统自带的库,如 QtQuickQtQuick.Controls 等,也可以是自定义的库。
  • 版本号:版本号通常包括主版本号和次版本号(例如 6.0)。在 QML 中,通过指定版本号来确保使用特定的 API 版本。如果不指定版本号,默认会使用安装的最新版本。
  • 版本兼容性:QML 支持兼容多个版本的库,因此可以同时提供新版本和旧版本的兼容支持。例如,可以导入 6.0 版本的库,但如果项目需要兼容较低版本,则可以同时提供多个版本的实现。

解决命名冲突

当导入多个库时,有可能会遇到命名冲突的问题,比如多个库中都存在同名组件。为了解决这种问题,可以使用 as 关键字为导入的库指定一个别名,这样就可以通过别名来访问库中的组件。

例如,以下代码导入了 QtQuick.Controls 并为其指定了别名 CON

import QtQuick.Controls 6.0 as CONRectangle {width: 400height: 400// 使用带有命名空间的 Button 组件CON.Button {text: "This is a button from QtQuick.Controls"anchors.centerIn: parent}
}

通过这种方式,即使导入了多个库中存在同名的 Button,也可以通过别名来区分不同的库。

导入目录中的代码

在实际项目开发中,我们可能会将多个相关的 QML 文件放入一个目录中,这些文件可以被当作一个整体导入到主项目中。这样可以减少逐个导入的麻烦,并提高代码组织的清晰度。

  • 步骤 1:在项目目录下创建一个新目录,例如 MyDir

  • 步骤 2:在 MyDir 目录中创建多个 QML 文件,例如 Type1.qmlType2.qml

    Type1.qml:

    import QtQuick 2.0Text {text: "This is Type 1"
    }
    

    Type2.qml:

    import QtQuick 2.0Text {text: "This is Type 2"
    }
    
  • 步骤 3:在主文件中导入整个目录。

    import "MyDir"Rectangle {width: 400height: 400// 使用目录中定义的类型Type1 {anchors.top: parent.topanchors.horizontalCenter: parent.horizontalCenter}Type2 {anchors.bottom: parent.bottomanchors.horizontalCenter: parent.horizontalCenter}
    }
    

通过导入整个目录,可以使用该目录中的所有 QML 类型,而不需要逐个导入每个文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/55219.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android AMS介绍

注:本文为作者学习笔记,如有误,请各位大佬指点 系统进程运行环境的初始化 Context是一个抽象类,它可以访问application环境的全局信息和各种资源信息和类 context功能: 对Activity、Service生命周期的管理通过Intent发…

LabVIEW自动生成NI-DAQmx代码

在现代数据采集和控制系统中,LabVIEW被广泛应用于各种工业和科研领域。其中,NI-DAQmx是一个强大的驱动程序,可以帮助用户高效地管理和配置数据采集任务。本文将介绍如何在LabVIEW中通过DAQ Assistant Express VI和任务常量自动生成NI-DAQmx代…

Go基础学习07-map注意事项;多协程对map的资源竞争;sync.Mutex避免竟态条件

文章目录 Go中map使用以及注意事项map使用时的并发安全问题 Go中map使用以及注意事项 Go语言中map使用简单示例: func main() {var mp map[string]int// mp : map[string]int{}val, ok : mp["one"]if ok {fmt.Println(val)} else {fmt.Println(val)}mp[…

强化学习核心概念与公式总结

强化学习核心概念与公式总结 1. 核心概念 1.1 智能体(Agent)和环境(Environment) 智能体:学习和做决策的实体环境:智能体交互的外部系统1.2 状态(State) 描述环境在特定时刻的情况1.3 动作(Action) 智能体可以执行的操作1.4 奖励(Reward) 环境对智能体动作的即时反馈1.5 策…

Python编码系列—Python状态模式:轻松管理对象状态的变化

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

【力扣 | SQL题 | 每日四题】力扣1440, 1378, 1421, 1393, 1407

1. 力扣1440:计算布尔值表达式的值 1.1 题目: 表 Variables: ------------------------ | Column Name | Type | ------------------------ | name | varchar | | value | int | ------------------------ 在 SQL 中&#…

架构演化--将MVC代码重构成DDD

什么是好的代码架构 在当前的工作中我们所面临的主要矛盾是“越来越多的多场景化复杂业务需求与有限的研发人力之间的矛盾”。而要解决这一矛盾,就要求我们的系统能做到:设计易拓展、代码易复用、逻辑易传承、运行更稳定。 设计易拓展 一个好的架构应该…

Ceph RocksDB 深度调优

介绍 调优 Ceph 可能是一项艰巨的挑战。在 Ceph、RocksDB 和 Linux 内核之间,实际上有数以千计的选项可以进行调整以提高存储性能和效率。由于涉及的复杂性,比较优的配置通常分散在博客文章或邮件列表中,但是往往都没有说明这些设置的实际作…

如果您忘记了 Apple ID 和密码,按照指南可重新进入您的设备

即使您的 iPhone 或 iPad 由于各种原因被锁定或禁用,也可以使用 iTunes、“查找我的”、Apple 支持和 iCloud 解锁您的设备。但是,此过程需要您的 Apple ID 和密码来验证所有权并移除激活锁。如果您忘记了 Apple ID 和密码,请按照我们的指南重…

教程:在Linux上启动、运行、杀掉和管理项目程序

笔记 1. 启动并运行一个项目程序 假设你的项目程序是一个可执行文件 my_project,位于 /data 目录下。 cd /data ./my_project 2. 杀掉一个正在运行的项目程序 首先,找到程序的进程ID (PID)。 ps aux | grep my_project 找到对应的PID,然后…

G502 鼠标自定义(配合 karabiner)

朋友送了我一个 G502 多功能鼠标,除了鼠标正常的左键、右键和滑轮外,额外提供了 6 个按键,并且滑轮可以向左、向右、向下按下,共计 9 个自定义的按键。 虽然是 karabiner 的老用户,但一直在使用 TrackPad,所…

SpringGateway(网关)微服务

一.启动nacos 1.查看linux的nacos是否启动 docker ps2.查看是否安装了nacos 前面是你的版本,后面的names是你自己的,我们下面要启动的就是这里的名字。 docker ps -a3.启动nacos并查看是否启动成功 二.创建网关项目 1.创建idea的maven项目 2.向pom.x…

VMware 虚拟机 下载安装 Centos7 和Windows10 镜像源

准备工作 下载 VMware链接:稍后发布链接 Centos7完整版链接:https://www.123865.com/ps/EF7OTd-mdAnH Centos7mini版链接:https://www.123865.com/ps/EF7OTd-1dAnH Windows10链接:https://www.123865.com/ps/EF7OTd-4dAnH 演示环境…

【Git】一文看懂Git

Git 一、简介1. Git 与 SVN 区别1.1 Git 是分布式的,SVN 不是1.1.1 分布式版本控制系统Git1.1.2 集中式版本控制系统SVN 1.2 Git 把内容按元数据方式存储,而 SVN 是按文件1.3 Git 分支和 SVN 的分支不同1.4 Git 没有一个全局的版本号,而 SVN …

CS 工作笔记:SmartEdit 里创建的是 CMS Component

下图是在 SmartEdit 里创建的 cms Component,在 Back-Office 里的截图: SAP Commerce Cloud 的 CMS Component 是其内容管理系统 (CMS) 的核心组成部分,它提供了对在线商店或平台内容的灵活管理。通过这些组件,用户能够在不涉及复…

C# 字符串(String)的应用说明一

一.字符串(String)的应用说明: 在 C# 中,更常见的做法是使用 string 关键字来声明一个字符串变量,也可以使用字符数组来表示字符串。string 关键字是 System.String 类的别名。 二.创建 String 对象的方法说明&#x…

Java研发笔记4——C语言程序设计学习笔记3

我们继续第二模块初识C语言的学习,上一篇笔记当中我们详细讲解了什么是C语言 以及第一个C语言程序。本篇笔记中我们继续从数据类型开始学习,后面的内容还包括:数据类型 、变量与常量 、字符串转义字符注释 、选择语句 、循环语句 、函数 、数…

Spark SQL分析层优化

导读:本期是《深入浅出Apache Spark》系列分享的第四期分享,第一期分享了Spark core的概念、原理和架构,第二期分享了Spark SQL的概念和原理,第三期则为Spark SQL解析层的原理和优化案例。本次分享内容主要是Spark SQL分析层的原理…

亚马逊 Bedrock 平台也能使用Llama 3.2 模型了

亚马逊 Bedrock 平台推出 Llama 3.2 模型:多模态视觉和轻量级模型 概述 由 Meta 提供的最新 Llama 3.2 模型现已在 Amazon Bedrock 平台上推出。这一新模型系列标志着 Meta 在大型语言模型(LLM)领域的最新进展,它在多种应用场景…

Java Web 之 Session 详解

在 JavaWeb 开发中,Session 就像网站的专属记忆管家,为每个用户保管着重要的信息和状态,确保用户在网站的旅程顺畅无阻。 场景一: 想象你去一家大型超市购物,推着购物车挑选商品。这个购物车就如同 Session&#xff…