QtQML系列 - QML插件

本文介绍了QML的基本概念,作为Qt框架的一部分,以及如何在大型软件系统中利用QML的灵活性和C++的性能。重点讲解了QML与C++的通信机制,包括不同版本的类型注册方法,官方示例和自定义QtQuick2ExtensionPlugin项目的实现。

目录

系列文章目录

1.QML是什么?

2.引用文章or文档

3.插件示例

3.1官方示例 Creating C++ Plugins for QML

3.2  自定义Qt Quick 2 Extension Plugin 项目


系列文章目录

系列文章Read Me


前言

大型和复杂的软件系统中,插件是一种广泛应用的思想和模式。

总的来说,插件为软件开发者和用户提供了很多优势。他们提供了灵活性和可扩展性,使软件更加适应多种不同的应用场景。

下面介绍在QML中如何封装


1.QML是什么?

QML,全称为Qt Meta-Object Language,是一种用于创建用户界面的声明性编程语言。它是由Qt框架开发的、基于JavaScript语法的标记语言。

QML的特点是简洁、易于学习和使用,并且能够充分利用Qt框架的优势,如跨平台性、高性能、可扩展性和可定制性等。QML不需要编写大量的代码来创建和布局用户界面,而是通过声明式的方法来描述UI元素、交互和动画效果等。

QML可以与C++语言进行混合编程,以便在Qt应用程序中使用QML和C++的优势。使用QML和Qt Creator工具,开发人员可以轻松创建出现代化且高效的用户界面。

QML被广泛应用于Qt Quick技术中,Qt Quick是一个用于创建现代UI界面和动画的框架。QML和Qt Quick可以用于多种平台,如移动设备、桌面软件、嵌入式系统等。由于QML的易用性和灵活性,它已成为Qt框架的重要组成部分,为开发高质量的用户界面提供了强大的工具和支持。

(以上来自优快云创作助手)

2.Qt和Qml怎么通讯

2.1官方文档

doc - Qt 5.15 中的 QML 类型注册

2.2 before 5.15

2.2.1 注册函数

到目前为止,在 QML 中使用 C++ 类型的常用方法是使用 qqml.h 标头中提供的注册函数:

  • qmlRegisterType()、
  • qmlRegisterSingletonType()、
  • qmlRegisterUncreatableType()

2.2.2 qmltypes声明文件

qmltypes 文件包含有关插件注册的类型的元信息,但只能用在开发qml extension plugin时。

当我们仍需要从主程序(C++)用2.2.1的方法注册类型时,还是需要用C++来指定类型。

综上,仍然存在一个冗余类型规范的问题。

2.2.3 qmlplugindump工具

该工具将以与 QML 引擎加载插件相同的方式加载您的插件。

它将提取有关其中包含的所有类型的信息,以生成 plugins.qmltypes 文件。

缺点:

  1. 会在您的插件中执行不相关的代码,
  2. 不支持跨平台、也不适用于交叉编译构建

2.3 from 5.15

5.15中重新设计了注册系统:

  1. 停止使用2.2.1中列举的注册函数类型
  2. qqml.h提供了一组可以添加到类声明中的宏,可以将类型标记为导出到 QML。 比如说“QML_ELEMENT”。
  3. 添加“CONFIG += qmltypes”来触发实际注册
  4. 这种 QML 的 C++ 类型静态注册不仅会为插件生成 qmltypes 文件,还会为您的主应用程序生成 qmltypes 文件

//2023/9/20 编辑

3.demo

3.1官方示例 Creating C++ Plugins for QML

Creating C++ Plugins for QML | Qt QML 5.15.15

3.2  自定义Qt Quick 2 Extension Plugin 项目

Qt QML 在使用 CMake 构建项目时是支持使用 `qmldir` 文件进行模块声明的。`qmldir` 是 QML 模块的核心配置文件,用于定义模块的元信息、类型声明以及资源路径等[^3]。 在 CMake 项目中,为了确保 QML 工具链(如 Qt Creator 的 QML 编辑器)能够正确识别模块并找到 `qmldir` 文件,通常需要将包含 `qmldir` 的目录添加到 `QML_IMPORT_PATH` 中。例如,可以通过以下方式设置: ```cmake list(APPEND QML_DIRS "${CMAKE_SOURCE_DIR}/qml") set(QML_IMPORT_PATH "${QML_DIRS}" CACHE STRING "QML import paths") ``` 这样设置后,Qt Creator 和其他 QML 工具在解析 QML 文件时就不会再提示“QML Module not found”错误[^2]。 此外,在构建插件或独立模块时,也可以通过 CMake 的 `configure_file` 或 `add_custom_command` 来复制 `qmldir` 文件到构建目录,确保模块结构完整。例如: ```cmake add_custom_command(TARGET myplugin POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/qmldir ${CMAKE_CURRENT_BINARY_DIR}/MyPlugin/qmldir ) ``` 在 Qt6 中,还可以使用 `qt_add_qml_module()` 函数来更方便地声明 QML 模块,并自动处理 `qmldir` 文件的生成和部署。例如: ```cmake qt_add_qml_module(appdemo01 URI demo01 VERSION 1.0 QML_FILES qml_src/Main.qml RESOURCES qml_src/qmldir ) ``` 通过上述方式,可以确保 CMake 构建系统与 QML 模块机制良好兼容,并支持使用 `qmldir` 文件进行模块声明和资源管理[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值