QML自定义模块及qmldir的使用

56 篇文章 46 订阅

前言

在开发QtQuick项目中,当项目文件很多的情况下,可能会分成多级文件夹来进行分类,还有一些通用类型文件,如公共组件,通用配置等等,需要在各个不同的文件中进行调用,这种情况下,一种方式是在当前需要引用的文件中通过关键字import 加上相对路径,从而找到通用文件目录。另一种方式就是将通用文件目录设置成qml模块形式,通过import直接引入模块名称就可以直接调用相关qml了,这样的好处是在任何不同的目录中都可以随处导入模块,而不用考虑相对路径的问题。

这里要介绍的就是如何在qml项目中定义模块,针对大型项目中使用尤其方便。

正文

首先,模块的使用需要一个qmldir文件,这是一个纯文本文件(没有后缀),用来定义qml模块

文件格式:

module 模块名称       #声明模块的模块标识符,必须与模块的安装路径匹配,必须是文件的第一行
#依次为类型名称 | 类型的模块版本 | QML文件名(这里还有可选参数[singleton]用于声明单例类型)
singleton  模块  版本  qml文件
 
比如:
module Component   #声明模块的模块标识符
singleton Config 1.0 Config.qml
CusButton 1.0 CusButton.qml
...

注意:这里可以通过singleton来声明是否为单例类型,QML中的单例通常用在通用配置文件中。

下面来看示例:
创建一个演示demo
在这里插入图片描述
为方便演示,这里特意创建了多级文件夹,Component目录是我们设置的模块,包含的是一些自定义控件封装,以及通用配置文件,在模块目录中添加一个qmldir文件,qmldir内容如下:

module Component
singleton Config 1.0 Config.qml
CusButton 1.0 CusButton.qml
CusText 1.0 CusText.qml

接下来重要步骤,在pro文件中添加

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH = $$PWD/

注意 这里的路径要指到模块文件夹的上一级目录,由于演示demo的模块文件夹Component和工程文件pro是同一个目录,所以这里QML_IMPORT_PATH 就设置路径为当前路径即可。

然后在main文件中,找到engin定义的地方,添加设置addImportPath

engine.addImportPath("qrc:/");

这里qrc路径同样是要指到模块文件夹的上一级目录。

ok,接下来看看如何使用:
在任意目录的文件中如果需要引用模块内的文件,可以直接导入模块名 import Component 1.0

import QtQuick 2.0
import Component 1.0

Rectangle {

    color: Config.subClr

    CusButton{
        //...
    }
}

由于Config文件设置的是单例,所以可以直接通过文件名来引用其中的属性,如:Config.subClr

Config文件内容如下,单例设置需要在文件最前面添加 pragma Singleton来进行声明:

pragma Singleton

import QtQuick 2.13
import QtQml 2.13

QtObject {

    readonly property color mainClr: "#AAAAAA"
    readonly property color subClr: "#666666"
    //....
}

ok,通过以上方式定义模块来使用,在大型项目中非常常见,QML官方的很多demo中也是这样使用,对于不同层级QML文件相互引用非常方便。最关键步骤就是在pro中添加定义以及在engine设置addImportPath路径。

演示demo下载

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
假设需求是需要一个带有圆角边框的按钮,我们可以通过自定义组件来实现。 首先,创建一个新的 QML 文件,命名为 `RoundButton.qml`。在该文件中,定义一个带有圆角边框的矩形,并在其内部放置一个按钮。 ``` import QtQuick 2.0 import QtQuick.Controls 2.0 Item { property alias text: button.text property alias font: button.font property alias textColor: button.textColor property alias backgroundColor: button.backgroundColor property alias hoverEnabled: button.hoverEnabled Rectangle { id: background color: backgroundColor radius: 10 border.width: 2 border.color: "black" width: button.width + 20 height: button.height + 20 Button { id: button anchors.centerIn: parent text: "Button" font.pixelSize: 24 textColor: "white" hoverEnabled: true background: Rectangle { color: hoverEnabled ? "#2c3e50" : "#34495e" radius: 10 } } } } ``` 在这个自定义组件中,我们提供了一些属性,如文本、字体、文本颜色、背景颜色和悬停效果等。通过这些属性,可以在使用该组件时,方便地设置组件的各种属性。 接下来,在主 QML 文件中,我们可以使用这个自定义组件,像使用其他 QML 控件一样。 ``` import QtQuick 2.0 Rectangle { width: 400 height: 400 RoundButton { text: "Click me" font.pixelSize: 20 backgroundColor: "lightblue" textColor: "white" onClicked: console.log("Button clicked") } } ``` 在这个例子中,我们将自定义组件 `RoundButton` 添加到主 QML 文件中,并设置了它的一些属性,如文本、字体、背景颜色和文本颜色等。当用户点击按钮时,会触发 `onClicked` 信号,并在控制台输出一条信息。 通过这样的方式,我们可以方便地使用自定义组件,实现特定的需求,并且可以在多个项目中重复使用
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luoyayun361

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值