QML教程(一)基础语法

目录

一、导入

二、对象声明

 三、对象属性

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"
    }
}
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: qt qml教程是一份关于Qt Quick技术的教学文档。Qt QML是Qt框架中的一部分,用于开发跨平台的用户界面。它提供了一种声明性的方式来构建用户界面,使开发人员能够轻松地创建现代化、动态的应用程序。 qt qml教程PDF包含了基础知识和高级技巧,适合初学者和有经验的开发者。教程通常从介绍Qt QML的概念开始,然后逐步深入讲解如何编写QML代码以及如何在Qt应用程序中集成QML界面。 该教程通常涵盖以下主题: 1. QML语法和基本元素:介绍QML的基本语法、属性、信号和槽机制,以及如何使用QML中的元素构建用户界面。 2. 模型和视图:讲解如何使用Qt的模型和视图框架来管理和展示数据。 3. 动画和过渡效果:介绍如何使用QML的动画和过渡效果来创建流畅、吸引人的用户界面。 4. 响应式布局:讲解如何使用anchors和layouts来创建响应式的用户界面,以适应不同的屏幕尺寸和方向。 5. 与C++的交互:介绍如何在QML中与C++代码进行交互,以实现更复杂的功能和业务逻辑。 通过阅读qt qml教程PDF,开发人员可以快速掌握使用Qt QML开发用户界面的技巧,并能够构建出现代化、灵活和跨平台的应用程序。此外,Qt QML教程还提供了实际的示例代码和实操项目,可供开发者参考和练习。 ### 回答2: Qt qml 教程 PDF 是一份关于 Qt Quick Markup Language (QML) 的教程指南,提供了使用 QML 进行跨平台应用程序开发的详细步骤和示例代码。以下是该教程的一些特点: 1. 适用性广泛:Qt QML 是一种用于创建现代用户界面的语言,可用于开发跨平台的桌面应用程序、移动应用程序和嵌入式系统应用程序。 2. 官方指南:该教程由 Qt 官方提供,因此可以确保其准确性和更新性。它是一份全面的指南,旨在帮助开发人员快速上手 QML。 3. 详细说明:教程详细介绍了 QML 的基本语法、属性和信号的使用方法,以及如何创建可重用的组件和自定义对象。 4. 实例代码:教程中提供了大量的示例代码,涵盖了各种常见的 UI 元素和交互方式。这些示例代码可以帮助开发人员快速了解和应用 QML 的各种功能。 5. UI 设计:该教程还介绍了一些关于用户界面设计的最佳实践和技巧,帮助开发人员创建出美观、易用和可定制的界面。 6. 教学进度:教程按照逐步递增的方式组织,从简单的概念和技术开始,逐渐引入更复杂的概念和高级功能。 总而言之,Qt qml 教程 PDF 是一份全面的、由官方提供的有关 Qt QML教程指南,为开发人员提供了学习和了解 QML 的最佳途径。通过掌握这些知识,开发人员可以更高效地使用 Qt 创建强大且具有吸引力的用户界面。 ### 回答3: 有关于Qt QML教程的PDF是一种书籍或文档形式,用于指导和教授有关该技术的知识和技能。Qt QML是一种基于Qt框架的声明性编程语言,主要用于开发图形用户界面(GUI)和应用程序逻辑。这种教程PDF可以提供以下内容: 1. QML基础知识:教程PDF通常会介绍QML的基本语法、语义和数据类型,以便读者能够理解和编写QML代码。 2. QML元素和组件:教程PDF将介绍Qt提供的各种QML元素和组件,如文本框、按钮、菜单等,以及它们的属性和用法。 3. 控件布局和样式:教程PDF将详细介绍如何使用QML创建和布局GUI控件,并设置它们的样式和外观。 4. 信号与槽机制:教程PDF将解释QML中的信号和槽机制,以及如何使用它们实现不同组件之间的通信和交互。 5. 动画和过渡效果:教程PDF可能会讲解如何使用QML创建动画和过渡效果,以增强用户界面的交互性和视觉吸引力。 6. Qt Quick控件和场景图:教程PDF可能会介绍Qt Quick控件和场景图的概念和使用方法,以便读者能够使用这些高级特性进行复杂的GUI设计。 总的来说,Qt QML教程PDF可以作为学习和掌握Qt QML技术的参考资料,帮助读者了解和应用该技术,以开发高质量和可交互性强的GUI应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

文子阳

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

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

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

打赏作者

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

抵扣说明:

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

余额充值