QML编程知识——基础语法知识

目录

引言

一、概述

二、Import 语法

三、Object 对象声明

1. 简单对象声明

2. 子对象声明

四、属性与绑定

自定义属性

别名属性

六、基本元素与控件

1. Rectangle(矩形元素)

​编辑

 2. Text(文本元素)

​编辑

3. Image(图像元素)

4. Button(按钮元素)

5. TextField 和 TextArea

TextField(单行文本框)

TextArea(多行文本框)

6. BusyInidcator(繁忙显示器)

七、信号与槽

信号

八、总结


引言

QML(Qt Modeling Language)是一种声明式编程语言,广泛用于Qt框架中,特别是与Qt Quick模块结合使用,以创建丰富且动态的用户界面。QML允许开发者通过对象的属性以及它们如何相互关联和响应来定义界面,这种声明式的方式使得界面设计更加直观和高效。本文将详细分析QML的基础语法知识。

一、概述

QML的语法类似于HTML,但更加灵活和强大。它结合了HTML的标记风格和JavaScript的脚本功能,使得开发者能够同时定义UI结构和编写逻辑代码。QML文档是QML代码的独立文件,用于定义QML对象类型,这些类型可以在整个应用程序中重用。

二、Import 语法

QML文档的顶部可以包含一个或多个import语句,用于导入需要的模块或文件。导入可以是已注册类型的版本化命名空间、包含QML文档类型定义的相对目录,或者JavaScript文件。import语句的格式如下:

import QtQuick 2.0  
import QtQuick.LocalStorage 2.0 as Database  
import "../privateComponents"  
import "somefile.js" as Script

这些import语句使得QML文件能够使用来自Qt Quick模块或其他自定义模块的类型和对象。

三、Object 对象声明

QML中的对象通过对象声明来定义,对象声明描述了要创建的对象的类型以及要赋予对象的属性。每个对象还可以包含嵌套的对象声明,以定义子对象。

对象和属性:以大写字母开头,后面跟一对大括号{}, {}之中是该对象的属性,属性以键值对“属性名:值” 的形式。
对象标识符:每个对象都可以指定唯一一个的id值,这样便可以在其他对象中识别并引用该对象。

1. 简单对象声明

一个简单的对象声明示例如下:

Rectangle {  
    width: 100  
    height: 100  
    color: "red"  
}

这里声明了一个Rectangle类型的对象,并设置了其宽度、高度和颜色属性。

2. 子对象声明

子对象声明可以进一步细化对象的属性,例如:

Rectangle {  
    width: 100  
    height: 100  
    gradient: Gradient {  
        GradientStop { position: 0.0; color: "yellow" }  
        GradientStop { position: 1.0; color: "green" }  
    }  
}

这个例子中,Rectangle对象包含一个Gradient子对象,Gradient对象又包含两个GradientStop子对象,用于定义渐变色。

四、属性与绑定

QML中的属性使用name: value的语法来赋值。属性可以是基础数据类型(如int、string等),也可以是复杂的对象或类型。此外,QML还支持属性绑定,即一个属性的值可以依赖于另一个属性的值。

自定义属性

除了内置属性外,QML还允许开发者通过property关键字添加自定义属性:

Rectangle {  
    width: 100  
    height: 100  
    property int myNumber: 10  
}

别名属性

别名属性(alias)允许将一个属性的值映射到另一个属性的值上,实现间接的引用:

Rectangle {  
    width: 100  
    height: 100  
    property alias myWidth: width  
}

五、注释

QML中的注释语法与C++相同,单行注释以//开始,多行注释以/*开始并以*/结束。注释对于解释代码逻辑、临时禁用代码段等非常有用。

六、基本元素与控件

QML提供了多种基础元素和控件,用于构建用户界面。以下是一些常用的元素和控件及其示例:

1. Rectangle(矩形元素)

用于绘制矩形,并可以设置颜色、边框等:

Rectangle {
        width: 100
        height: 100
        color: "green"

        Rectangle {
            x: 25
            y: 25
            width: 50
            height: 50
            color: "yellow"
        }
    }

 2. Text(文本元素)

用于显示单行或多行文本:

Rectangle {
        x: 10
        y: 10
        width: 200
        height: 50
        color: "aquamarine"
        border.color: "aqua"
        border.width: 1

        Text {
            x: 30
            y: 8
            text: "文本元素"
            font.family: "隶书"   // 字体名称
            font.pixelSize: 32  // 字体大小
            font.bold: true // 粗体
        }

    }

3. Image(图像元素)

用于显示图片,可以加载本地或网络图片资源:

// 填充模型
            fillMode: Image.TileVertically // 水平
            fillMode: Image.TileHorizontally // 垂直
            fillMode: Image.Pad     // 填充模式不会使图像变形
            fillMode: Image.PreserveAspectFit     // 填充模式按照比例缩放 不裁剪
// 显示单张图片
Image {
        id: image01
        anchors.centerIn: parent    // 显示指向中心
        width: 20
        height: 50
        source: "/images/CSDN.JPG" // 加载资源文件路径
        fillMode: Image.Pad     // 填充模式不会使图像变形
}

// 多张图片显示
    Column{    // 按列布局
        anchors.centerIn: parent    // 显示指向中心
        Image {
            width: 50
            height: 10
            source: "/images/CSDN.JPG" // 加载资源文件路径
            fillMode: Image.Pad     // 填充模式不会使图像变形
        }
        Image {
            width: 100
            height: 50
            source: "/images/CSDN.JPG" // 加载资源文件路径
            fillMode: Image.PreserveAspectFit     // 填充模式按照比例缩放 不裁剪
        }
    }

4. Button(按钮元素)

用于触发事件,如点击:

import QtQuick.Controls 2.5 // 控件
// 自定义单击次数变量
    property int count: 1
    Button {
        id: mybutton01
        x: 10
        y: 10
        width: 80
        height: 30
        text: "单击按钮"
        // icon.source: "./././"   //添加图标

        // 单击槽函数
        onClicked: {
            console.log("单击"+ (count++) + "次")
        }
    }

5. TextField 和 TextArea

用于输入和显示单行或多行文本:

TextField(单行文本框)
TextField {
    x: 10
    y:10
    placeholderText: "Enter your name"
    font.pixelSize: 16
    width: 200
    height: 40
    onTextChanged: console.log("New text:", text)
}

TextField控件显示了一个占位符文本,当用户在文本框中输入时,onTextChanged信号会被触发,从而可以在控制台中打印出当前的文本内容。

TextArea(多行文本框)
TextArea {
    x:10
    y:100
    width: 300
    height: 100
    wrapMode: TextArea.Wrap
    placeholderText: "Enter your message..."
    font.pixelSize: 14
    onTextChanged: console.log("Text area content changed.")
}

TextArea控件用于显示和编辑多行文本。通过设置wrapMode属性为TextArea.Wrap,文本会根据控件的宽度自动换行。TextArea同样支持placeholderTextonTextChanged等属性与信号。

6. BusyInidcator(繁忙显示器)

用于在应用程序中显示一个忙指示器。当应用程序正在执行长时间运行的任务时,可以使用BusyIndicator来向用户提示应用程序正在处理,并防止用户进行任何不必要的操作。

import QtQuick.Controls 2.5
import QtGraphicalEffects 1.0


    BusyIndicator {
        id: mybusyIndicator
        // 锚点布局
        anchors.centerIn: parent
        implicitHeight: 200
        implicitWidth: 200

        contentItem: Item {
            id: myitem
            // 中间空心白色部分
            Rectangle {
                id: myrect
                width: parent.width
                height: parent.height
                color: Qt.rgba(0,0,0,0)
                radius: width/2
                border.width: width/10
                visible: false  // 无边框
            }

            ConicalGradient {
                width: myrect.width
                height: myrect.height

                gradient: Gradient{
                    GradientStop {
                        position: 1.0
                        color: "aqua"
                    }
                    GradientStop {
                        position: 0.0
                        color: "aquamarine"
                    }
                }
                source: myrect
                Rectangle {
                    anchors.top: parent.top
                    anchors.horizontalCenter: parent.horizontalCenter
                    width: myrect.border.width
                    height: width
                    radius: width/2
                    color: "yellow"     // 黄色小球
                }
                RotationAnimation on rotation{
                    from: 0
                    to: 360     // 360°旋转
                    duration: 1500
                    loops: Animation.Infinite   // 循环
                }
            }

        }
    }
}

七、信号与槽

QML中的信号与槽机制用于对象之间的通信。当一个对象的状态发生变化时,它可以发出一个信号,其他对象可以监听这个信号,并在信号被触发时执行相应的槽函数(即回调函数)。

信号

在QML中,信号是由对象自动发出的,用于通知其他对象某个事件已经发生。信号不能直接调用,但可以被监听和响应。

槽是对象中的函数,用于响应信号。在QML中,你可以通过onSignalName:语法来定义槽,其中SignalName是信号的名字。

在Button元素示例中,Button对象有一个clicked信号,当按钮被点击时,这个信号会被发出。通过onClicked:语法,我们定义了一个槽来响应这个信号,当信号被触发时,会在控制台中打印出消息。

八、总结

QML以其直观易用的语法和强大的功能,成为了Qt框架中创建现代用户界面的首选语言。通过本文的介绍,你应该对QML的基础语法知识有了更深入的了解,包括import语句、对象声明、属性与绑定、注释、基本元素与控件,以及信号与槽机制。掌握这些基础知识,将帮助你更高效地开发Qt应用程序的用户界面。随着实践的深入,你还可以探索QML的更多高级特性和最佳实践,以进一步提升你的开发能力。

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值