QML教程(一)

news2024/12/25 9:05:10

目录

一、导入

二、对象声明

 三、对象属性

1.声明对象属性

2.信号属性

3.方法属性

4.附加属性略 

5.枚举属性 

6.对象属性赋值

四、自定义对象


一、导入

  1. 模块导入
    语法:
    import <ModuleIdentifier> [<Version.Number>] [as <Qualifier>]

    例:

    import QtQuick
    import QtQuick 2.10
    import QtQuick as Quick
  2. 目录导入
    语法:
    import "<DirectoryPath>" [as <Qualifier>]

    例:

    import "../privateComponents"
    import "../textwidgets" as MyModule

二、对象声明

  1. 对象
    对象声明由其对象类型的名称组成,后跟一组大括号。然后,所有属性和子对象都在这些大括号内声明。例:
    import QtQuick 2.0
    
    Rectangle {
        width: 100
        height: 100
        color: "red"
    }
  2. 对象树中的子对象
    任何对象声明都可以通过嵌套对象声明定义子对象。这样,任何对象声明都会隐式声明可能包含任意数量的子对象的对象树。例:
    import QtQuick 2.0
    
    Rectangle {
        width: 100
        height: 100
    
        gradient: Gradient {
            GradientStop { position: 0.0; color: "yellow" }
            GradientStop { position: 1.0; color: "green" }
        }
    }
  3. 视觉场景中的子对象
    视觉场景中父子关系的概念由模块中的 Item 类型提供,这是大多数 QML 类型的基本类型,因为大多数 QML 对象都是要直观呈现的。例如,“矩形”和“文本”都是基于Item的类型
    import QtQuick 6.2
    
    Rectangle {
        width: 200
        height: 200
        color: 'red'
    
        data: [
            Text {
                anchors.centerIn: parent
                text: qsTr("Hello QML")
            }
        ]
    }
    

    简写形式

    import QtQuick 6.2
    
    Rectangle {
        width: 200
        height: 200
        color: 'red'
    
        Text {
            anchors.centerIn: parent
            text: qsTr("Hello QML")
        }
    }
    
  4. 坐标
    Qt Quick中使用的默认视觉坐标系统是项目坐标。这是一个笛卡尔坐标系,(0,0) 位于项目的左上角。x 轴向右增长,y 轴向下增长,因此项目的右下角位于坐标(宽度、高度)处。坐标数值是指在其父容器中的坐标。例:
    Rectangle {
        width: 200
        height: 200
        color: "red"
    
        Rectangle {
            x: 100
            y: 100
            width: 100
            height: 100
            color: "blue"
    
            Rectangle {
                width: 50
                height: 50
                color: "green"
            }
        }
    }

  5. 堆叠
    Qt Quick 项目使用递归绘制算法来确定在发生碰撞时将哪些项目绘制在顶部。通常,项目按照创建顺序(或在 QML 文件中指定z属性:低于0的z值将堆叠在父级下方)绘制在其父项目之上。z值的越大,优先级越高,但仅限于同父级比较,如果父级优先级低于其他父级,即使子级z值极大,也不会比其他父级要高。
  6. 注释
    单行注释以 // 开头,在行尾结束。
    多行注释以 /* 开头,以 */ 结尾
    例:
    Text {
        text: "Hello world!"    //a basic greeting
        /*
            We want this text to stand out from the rest so
            we give it a large size and different font.
         */
        font.family: "Helvetica"
        font.pointSize: 24
    }

 三、对象属性

1.声明对象属性

除枚举类型(用int代替)之外的任何 QML 值类型都可以用作自定义属性类型

语法:

[default] [required] [readonly] property <propertyType> <propertyName>

 例:

Item {
    property int someNumber
    property string someString
    property url someUrl
    property color previousColor
    //var 值类型是一个通用占位符类型,可以保存任何类型的值,包括列表和对象
    property var someNumber: 1.5
    property Rectangle someRectangle
    states: [
        State { name: "loading" },
        State { name: "running" },
        State { name: "stopped" }
    ]
    // 如果list只有一个项,则可以省略[]
    states: State { name: "running" }
    property list<Rectangle> siblingRects
    property list<Rectangle> childRects: [
        Rectangle { color: "red" },
        Rectangle { color: "blue"}
    ]
}

分组属性

Text {
    //dot notation
    font.pixelSize: 12
    font.b: true
}

Text {
    //group notation
    font { pixelSize: 12; b: true }
}

 默认属性:使用default标注为默认属性,使用时可以不用声明key

// MyLabel.qml
import QtQuick 2.0

Text {
    default property var someText

    text: "Hello, " + someText.text
}

使用时,而这效果相同 

MyLabel {
    Text { text: "world!" }
}

MyLabel {
    someText: Text { text: "world!" }
}

 on 语法:

<PropertyModifierTypeName> on <propertyName> {
    // attributes of the object instance
}

目前有两种使用方式:

  • 属性值写入侦听器
    目前主要用于监听动画属性,例:
    import QtQuick 2.0
    
    Item {
        width: 400
        height: 50
    
        Rectangle {
            width: 50
            height: 50
            color: "red"
    
            NumberAnimation on x {
                from: 0
                to: 350
                loops: Animation.Infinite
                duration: 2000
            }
        }
    }
  • 属性值源

2.信号属性

信号是来自对象的通知,指示发生了某些事件:例如,属性已更改、动画已启动或停止,或者图像已下载。例如,鼠标区域类型具有当用户在鼠标区域内单击时发出的单击信号。

每当发出特定信号时,都可以通过信号处理程序通知对象。信号处理程序使用语法 on<Signal 声明>其中 <Signal> 是信号的名称,第一个字母大写。信号处理程序必须在发出信号的对象的定义中声明,并且处理程序应包含调用信号处理程序时要执行的 JavaScript 代码块。

例如,下面的 onClicked 信号处理程序是在 MouseArea 对象定义中声明的,并在单击 MouseArea 时调用,从而导致打印控制台消息:

import QtQuick 2.0

Item {
    width: 100; height: 100

    MouseArea {
        anchors.fill: parent
        onClicked: {
            console.log("Click!")
        }
    }
}

语法:

signal <signalName>[([<parameterName>: <parameterType>[, ...]])]

例:

import QtQuick 2.0

Item {
    // 无参数可省略括号
    signal clicked
    signal hovered()
    // 指定参数
    signal actionPerformed(action: string, actionResult: int)
}

 发出信号:
直接通过id调用信号即可

id.actionPerformed("something", 1)

处理信号:
on<Signal>:fun即可

onDeactivated: console.log("Deactivated!")

属性更改信号处理器:

on<Property>Changed

例:

import QtQuick 2.0

TextInput {
    text: "Change this!"

    onTextChanged: console.log("Text has changed to:", text)
}


3.方法属性

语法:

function <functionName>([<parameterName>[: <parameterType>][, ...]]) [: <returnType>] { <body> }

例1:

import QtQuick 2.0
Rectangle {
    id: rect

    function calculateHeight() : real {
        return rect.width / 2;
    }

    width: 100
    height: calculateHeight()
}

 例2:

import QtQuick 2.0

Item {
    width: 200; height: 200

    MouseArea {
        anchors.fill: parent
        onClicked: (mouse)=> label.moveTo(mouse.x, mouse.y)
    }

    Text {
        id: label

        function moveTo(newX: real, newY: real) {
            label.x = newX;
            label.y = newY;
        }

        text: "Move me!"
    }
}

4.附加属性
略 

5.枚举属性 

枚举提供一组固定的命名选项。它们可以使用关键字在 QML 中声明:enum

// MyText.qml
Text {
    enum TextType {
        Normal,
        Heading
    }

    property int textType: MyText.TextType.Normal

    font.bold: textType == MyText.TextType.Heading
    font.pixelSize: textType == MyText.TextType.Heading ? 24 : 12
}

6.对象属性赋值

  • 初始化时的值赋值
    <propertyName> : <value>
    import QtQuick 2.0
    
    Rectangle {
        color: "red"
        property color nextColor: "blue" // combined property declaration and initialization
    }
  • 命令式值赋值
    [<objectId>.]<propertyName> = value
    import QtQuick 2.0
    
    Rectangle {
        id: rect
        Component.onCompleted: {
            rect.color = "red"
        }
    }

四、自定义对象

现在我们定义一个消息框对象:MessageLabel
新建QML文件:MessageLabel.qml

// MessageLabel.qml
import QtQuick

Rectangle {
    height: 50
    //声明消息内容:message
    property string message: "debug message"
    //声明消息类型:msgType(debug、warning、critical)
    property string msgType: "debug"
    Column {
        anchors.fill: parent

        Text {
            text: msgType.toString().toUpperCase() + ":"
            font.bold: msgType === "critical"
            color: msgType === "warning" || msgType === "critical" ? "red" : "blue"
            //动画
            ColorAnimation on color {
                running: msgType === "critical"
                from: "red"
                to: "black"
                duration: 1000
                loops: msgType === "critical" ? Animation.Infinite : 1
            }
        }
        Text {
            text: message
            color: msgType === "warning" || msgType === "critical" ? "red" : "blue"
        }
    }

}

使用:

// application.qml
import QtQuick

Column {
    width: 180
    height: 180
    padding: 1.5
    topPadding: 10.0
    bottomPadding: 10.0
    spacing: 5

    MessageLabel{
        width: parent.width - 2
        msgType: "debug"
    }
    MessageLabel {
        width: parent.width - 2
        message: "This is a warning!"
        msgType: "warning"
    }
    MessageLabel {
        width: parent.width - 2
        message: "A critical warning!"
        msgType: "critical"
    }
}

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

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

相关文章

【文献阅读】能源受限的无人机和移动充电站进行持续监控的稳健规划

标题&#xff1a;Robust Planning for Persistent Surveillance With Energy-Constrained UAVs and Mobile Charging Stations 作者&#xff1a;Xiaoshan Lin, Yasin Yazıcıo˘glu , and Derya Aksaray 来源&#xff1a;IEEE ROBOTICS AND AUTOMATION LETTERS 摘要 本文考虑…

DO 语句

DATA MYCLASS;SET SASHELP.CLASS;IF WEIGHT<120 THEN NOTE Normal;ELSE DO;NOTE Heavy;/* 赋值成缺失值 */WEIGHT.;END; RUN;PROC PRINT; RUN; DATA B;DO k 11 TO 0 BY -3;IF k < 5 THEN i k;ELSE i k - 1;OUTPUT;END; RUN;PROC PRINT; RUN; DO WHILE:只要条件满足&am…

Python异常处理(七)

python学习之旅(七) &#x1f44d;查看更多可以关注查看首页或点击下方专栏目录 一.什么是异常 程序运行的过程中出现了错误 定义&#xff1a;在程序运行中,检测到一个错误&#xff0c;程序中止运行并且出现了一些错误的提示,也称作BUG 例如&#xff1a;读取一个不存在的文件f…

[操作系统]进程

目录1.进程的概念2.如何管理进程3.进程的调度4.并行和并发5.进程调度需要使用的属性6.进程之间的通信7.进程和线程的区别操作系统是一个软件,对下要管理好各种硬件设备,对上要给各种软件提供稳定的运行环境.这篇博客主要讲解操作系统如何管理进程。 1.进程的概念 进程就是跑起…

Golang - 时间处理总结

Golang - 时间处理总结1 获取时间对象1.1 获取当前对象对象1.2 根据指定时间返回 time.Time 类型1.2 获取当前年月日时分秒、星期几、一年中的第几天等操作1.3 日期字符串解析成 time.Time 类型解析的时候需要特别注意时区的问题&#xff1a;2 时间对象转时间字符串3 时区4 时间…

严格模式和高阶函数

1、什么是严格模式 JavaScript 除了提供正常模式外&#xff0c;还提供了严格模式&#xff08;strict mode&#xff09;。 ES5 的严格模式是采用具有限制性 JavaScript 变体的一种方式&#xff0c;即在严格的条件下运行 JS 代码。 严格模式在 IE10 以上版本的浏览器中才会被支…

【C++】-- C++11 - 右值引用和移动语义(上万字详细配图配代码从执行一步步讲解)

目录 左值引用和右值引用 右值引用使用场景和意义 移动语义 传值返回问题 移动构造 移动赋值 总结 解决传值插入问题 完美转发 模板中的&&万能引用 完美转发std::forward 完美转发实际中的使用场景 左值引用和右值引用 其实在C11之前&#xff0c;C没有左右…

系统管理员喜欢 systemd 的 5 个理由

导读systemd 的速度和易用性使其成为管理现代 Linux 系统的流行方式。 系统管理员知道&#xff0c;在一台运行着的现代计算机上会发生很多事情&#xff1a;应用程序在后台运行、预定事件等待在特定时间被触发、事件写入日志文件、发送状态报告。在以前&#xff0c;不同的进程可…

为什么深度神经网络这么难训练

目录 1、深度网络训练困难的原因&#xff1a; 2、消失的梯度问题 3、不稳定的梯度问题 参考文章&#xff1a;为什么很难训练深度神经网络&#xff1f; - 腾讯云开发者社区-腾讯云 1、深度网络训练困难的原因&#xff1a; 训练速度慢 在深度网络中&#xff0c;不同的层学习…

《UEFI内核导读》UEFI Firmware Storage简介

敬请关注&#xff1a;“固件C字营 UEFI固件一般存储在被称之为“固件仓库”的非易失性存储器中&#xff0c;简称为FD&#xff08;固件设备&#xff09;&#xff0c;当前主流的存储介质是NorFlash它拥有非易失性、XIP以及可二次编程的特性。 固件设备可以分为物理设备和逻辑设备…

linux如何发送查收邮件的详解

一&#xff0c;linux用户发送给linux中的其它用户 1&#xff0c;使用命令 yum install sendmail -y安装sendmail软件 2&#xff0c;使用yum install mailx -y安装 mailx软件 3&#xff0c;使用命令systemctl start sendmail启动sendmail&#xff08;此过程消耗时间&#xff09…

你在项目里遇到的最大困难是什么,如何解决的?

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/Tyson0314/Java-…

Weiler-Atherton 算法介绍(简单易懂)

目录 一、算法介绍 二、算法描述 三、算法总结 一、算法介绍 Weiler Atherton多边形裁剪算法是一种允许裁剪凹面算法的算法。与 Sutherland-Hodgman 多边形裁剪算法最主要的区别是&#xff0c;该算法能够裁剪凹多边形&#xff0c;并不留下任何残留物。 裁剪示意图&#xff1…

关于微服务,这些你都了解吗-微服务介绍

文章目录一 认识微服务1.1 什么是微服务1.2 微服务的特点1.3 微服务诞生背景1.4 微服务架构的优势二 微服务生态1.1 硬件层1.2 通信层1.3 应用平台层1.4 微服务层三 微服务详解1.1 微服务架构1.2 服务注册和发现1.3 rpc调用和服务监控四 微服务与DDD1.1 什么是DDD1.2 DDD作用1.…

python快速实现某东方视频解密wasm算法

开始之前请大家先去了解一下 wasm这种技术(可以百度搜索一下 WebAssembly是什么?) 现在开始.... 1&#xff0c;先看一张图 首先写一个本地加载wasm的方法 00043706.wasm就是当前网站load的wasm库,如果遇到报错,请联系我&#xff0c;文章最后有qq联系方式 let u {} functio…

C++类和对象2:默认成员函数

我们通过this指针可以看出来&#xff0c;C其实隐藏了非常多的东西&#xff0c;很多事情它会在编译的时候包揽&#xff0c;那么作为最为重要的类和对象&#xff0c;它是不是还隐含了更多我们平常看不到的东西呢&#xff1f; 我们创建一个空类里面啥也不放。 class Text{}; 看上…

2_类加载子系统

目录 概述 类加载器子系统作用 类的加载过程 加载阶段 加载class文件的方式 链接阶段 准备 Prepare 解析 Resolve 初始化阶段 类加载器的分类 虚拟机自带的加载器 扩展类加载器&#xff08;Extension ClassLoader&#xff09; 应用程序类加载器&#xff08;系统类加…

阿里云计算工程师ACP考题归类解析

目录考纲答题技巧四式记的牢三妙招一、对象存储OSS二、专有网络VPC三、服务器ECS四、安全五、阿里云弹性伸缩Auto Scaling五、内容分发网络CDN总结考纲 重点学习ECS、VPC、OSS三部分。 答题技巧四式 战略是先做简单后做难度高的。 一、简化 做题问三个问题&#xff0c;按回答…

【云原生 | Kubernetes 实战】20、K8s Ingress 实现业务灰度发布

目录 通过 Ingress-nginx 实现灰度发布 一、Ingress Controller 多种发布策略介绍 场景一&#xff1a;将新版本灰度给部分用户 场景二&#xff1a;切一定比例的流量给新版本 二、模拟部署生产测试版本 Web 服务 2.1 部署一个 v1 版本: 2.2 再部署一个 v2 版本: 2.3 再…