0
点赞
收藏
分享

微信扫一扫

QML基本语法与构成规则

1. QML文件基本构成与结构分析(类比ECMAScript)

QML本身是一种语言(Qt元对象语言),语法遵循ECMAScript的语法,与javaScript语法兼容,因此在qml页面中,复杂逻辑可以使用js模块单独处理,简单逻辑直接内嵌js函数即可(也可注册Qt C++类)。下边根据一个简单的qml文件分析qml的语法结构

//main.qml
import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    id:root
    visible: true
    width: 640
    height: 480
    title: qsTr("Window Test")
    flags: Qt.FramelessWindowHint
    property int testProperty: 0
    property alias myAnimation:majorAnimation
    MyRect{
        anchors.fill: parent
    }
    MouseArea{
        anchors.fill: parent
        onClicked: {
            var x = 10;
            myAnimation.start();
        }
    }
    PropertyAnimation{
        id:majorAnimation
        target: root
        property:"x"
        from: 0
        to:1500
        duration: 1500
        easing.type: Easing.InOutQuad
        onFinished: {
            testProperty = 1
        }
    }
    Component.onCompleted: {
        console.debug("current pluging load finish\n");
    }
    onTestPropertyChanged: {
        console.log("testProperty value is: " + testProperty)
    }
}

1.2 语法结构分析

1.2.1 import语句

import与c/c++的include语句类似,此处是导入Quick的内置模块,本身也支持导入外部模块,比如QObject的子类类型或原生的js类型,在导入C++类型是需要注册,import xxx as yyy语句表示给当前xxx模块起个别名叫做yyy,以后就直接用yyy来取代xxx

1.2.2 Window{}的含义

结合ECMAScript对象的定义,ECMAScript的对象即为一系列无序属性的集合, 此处的Window{}即为一个Window对象,对象的访问使用对象id来访问,id属性没有被设置的对象为匿名对象。

1.2.3 xxx:XValue的含义

这种用:隔开的,代表xxx属性的值是XValue,这与CSS的语法相似,定义当前属性的值,当值发生变化时,需要使用xxx = XValue来修改

1.2.4 property与alias的含义

在QML中,property用来声明定义一个对象的额外属性,这与在Qt C++中使用Q_PROPERTY宏来声明一个类属性类似,而alias关键字是给当前某个对象或属性起一个别名类似c中的typedef,以后就可以不直接使用对象,而是使用对象别名,来访问对象方法或属性

1.2.5 MyRect自定义对象

QML支持自定义对象,一般地一个qml文件就是一个对象,对象在定义时,首字母必须是大写,这与对象的id属性刚好相反,对象id属性要求首字母必须小写。

//MyRect.qml
import QtQuick 2.12
Item {
    id:root
    Rectangle{
        anchors.fill: parent
        color:"#646464"
    }
}

1.2.6 onSignalChange:{} or onPropertyChange:{}

qml中当属性或信号值发生变化时,使用on+Signal(信号名字首字母大写)+Change的方式来处理信号或属性的变化,此处的{}看作是Qt c++中的槽函数,{}中的就是函数体,函数体内可以调用函数,定义函数或lambda表达式,定义变量等一系列操作,这有别于object的属性:值

1.3 QML模块划分

一般地,QML对象可以单独处理为一个qml文件,以供外部调用,或者内嵌在其它QML文件中使用,为了结构清晰,尽可能将模块划分清楚,使用单独的qml文件编写功能相对独立的模块。

小知识

- [1] 原文件或资源文件中的qml,可以右键使用quick designer 打开,从而快速布局/预览页面

- [2] 对于QML处理不了的非页面类复杂逻辑推荐使用js来单独处理,或编写单独的Qt c++处理类,之后注册导入

举报

相关推荐

0 条评论