QT学习笔记-qml开发


一、qml工程创建

1.新建一个项目

1.选择Qt Quick Application - Empty,点击choose。

2.选择创建路径和项目名称(不能有中文),后面一直点击下一步到工程建立完成。
在这里插入图片描述

2.项目中新建不同子文件

1.新建一个文件
在这里插入图片描述
2.文件路径和项目路径保持一致,文件命名不能出现中文
在这里插入图片描述
3.文件生成
在这里插入图片描述
4.在项目中编辑并调用子文件
1)主函数main.qml

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
   
   
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    Rectangle{
   
   
        x:100
        y:150
        z:1			//Z轴控制该元素图层位置
        width: 200
        height: 100
        color: "red"
    }
    MyRectangle{
   
   	//子文件名称
        x:200
        y:200
        z:0				//Z轴控制该元素图层位置
        width: 200      //主函数和子函数都可以定义
        height: 100
        myTopMargin: 10     //子函数中定义的变量可在主函数中传递参数
        myBottomMargin: 10  //上下边框距离
    }
}

2)子函数MyRectangle.qml

import QtQuick 2.0

    Rectangle{
   
   
        id:borderRect   //矩形元素id
        property int myTopMargin : 0    //自定义上边框,可在主函数中调用
        property int myBottomMargin : 0
        color: "black"
        Rectangle{
   
   
            id:innerRect    //矩形元素id
            color: "yellow"
            anchors.fill:parent     //填充整个父类窗口
            anchors.topMargin: myTopMargin    //距离上边框
            anchors.bottomMargin: myBottomMargin //距离下边框
            anchors.leftMargin: 5   //距离左边框0
            anchors.rightMargin: 5  //距离右边框0
        }
    }

3)效果图如下
在这里插入图片描述

二、qml语法

1.qml基本结构

元素名 {
   
   
    属性名1: 属性值1
    属性名2: 属性值2
    ...
    子元素1 {
   
   
        ...
    }
    子元素2 {
   
   
        ...
    }
    ...
}    
import QtQuick 2.12
import QtQuick.Window 2.12

Window {
   
   
    width: 640		//宽
    height: 480		//高
    visible: true	//是否可见
    title: qsTr("Hello World")		//标题
    //子元素1--矩形
    Rectangle {
   
   
    	width: 100
    	height: 100
    	color: "red"
	}
	//子元素2--文本
	Text {
   
   
    	text: "Hello World"
    	font.bold: true
    	font.pixelSize: 24
    	color: "red"
	}	
}

2.信号和槽

1.在 QML 中,可以通过信号和槽来实现元素之间的通信。信号是元素发出的消息,槽是元素接收消息的处理函数。
2.可以使用 onXXX 属性来定义信号,例如 onTextChanged 表示文本改变的信号。(on后面首字母要大写)
3.可以使用 Connections 元素来连接信号和槽,例如:

Rectangle {
   
   
    width: 100
    height: 100
    color: "red"
 
    signal clicked()	//定义信号--clicked
 
    MouseArea {
   
   			//监听鼠标事件
        anchors.fill: parent
        onClicked: parent.clicked()
    }
}
 
Rectangle {
   
   
    width: 100
    height: 100
    color: "blue"
 
    Connections {
   
   		//槽函数
        target: redRect
        onClicked: {
   
   	//点击事件发生后打印"Red rectangle clicked!"
            console.log("Red rectangle clicked!")
        }
    }
}

三、qml基本元素

1.Rectangle 矩形

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.5
Window {
   
   
//    x:30            //位置
//    y:30

    width: 320      //大小
    height: 240

//    minimumWidth: 320   //最小宽度
//    minimumHeight: 240  //最小高度
//    maximumWidth: 640   //最大宽度、高度
//    maximumHeight: 480

    visible: true   //是否可见
    title: qsTr("运行")   //标题

    opacity: 0.9     //窗口透明度、0-1的任意数(可以是小数)

    signal mysig()   //自定义信号

    //触发信号后实现的功能
    onMysig: {
   
   
    }

    //窗体生成控件能够自动生成对应信号和槽函数
    onWidthChanged: {
   
   
        console.log("width:",width)   //打印输出当前宽度值
    }
    onHeightChanged:{
   
   
        console.log("height:",height)   //打印输出当前宽度值
    }
    Button {
   
   
        id: btn1
        x:30
        y:30
        width: 60
        height: 40
        focus : true
        background: Rectangle{
   
   
            border.color: btn1.focus ? "blue" : "black" //边框颜色是否有点击,有为蓝色,没有为黑色
        }
        onClicked: {
   
   
            console.log("btn1 clicked") //按钮按下打印btn1 clicked
        }
        Keys.onRightPressed: {
   
             //键盘右键按下聚焦到按钮2
            btn2.focus = true
        }
    }
    Button {
   
   
        id: btn2
        x:100
        y:30
        width: 60
        height: 40
        background: Rectangle{
   
   
            border.color: btn2.focus ? "blue" : "black" //边框颜色是否有点击,有为蓝色,没有为黑色
        }
        onClicked: {
   
   
            console.log("btn2 clicked")
        }
        Keys.onLeftPressed: {
   
   
            btn1.focus = true
        }
    }
    onActiveFocusItemChanged: {
   
   
        console.log("active focus item changed",activeFocusItem)
    }

    Rectangle{
   
         //矩形
        id:rect1
        x:10
        y:10
        z:1         //Z轴控制在哪一图层
        width:100
        height:50
        color: "blue"

        MouseArea{
   
         //聚焦鼠标
            onClicked: {
   
   
                console.log("on clicked rt1")
            }
        }

    }
    Rectangle{
   
         //矩形
        id:rect2
//       anchors.fill:parent     //填充满父类窗口
//        anchors.horizontalCenter: parent.horizontalCenter    // 水平居中于父窗口,会随窗口变化
//        anchors.verticalCenter: parent.verticalCenter       // 垂直居中于父窗口,会随窗口变化
        anchors.centerIn: parent    //居于父窗口中心,会随窗口变化
//        anchors.left: rect1.right     //当前矩形左边等于rt2的右边
//        anchors.leftMargin: 20      //当前矩形与之前矩形20
        width:100
        height:50
        color: "red"
    }
    Rectangle{
   
         //矩形
        id:rect3
        anchors.top:rect1.bottom
        anchors.topMargin: 20
        width:100
        height:50
        color: "black"
    }
    Rectangle{
   
         //矩形
        id:rect4
        x:50
        y:100
        z:1
        width:50
        height:100
//        color: "yellow"
        rotation: 45    //旋转角度
        scale: 0.5  //放大缩小
//        opacity: 0.5    //透明度
        border.width: 5     //内边框
        border.color: "red" //红色
        radius: 30          //边角弧度
        gradient: Gradient {
   
       //渐变色从0-1 浅蓝-蓝
            GradientStop {
   
   position: 0.0;color: "lightsteelblue"}
            GradientStop {
   
   position: 1.0;color: "blue"}
        }
    }
}

2.Text 文本

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
   
   
    width: 640		//宽
    height: 480		//高
    visible: true	//是否可见
    title: qsTr("Hello World")		//标题
    //子元素1--矩形
    Rectangle {
   
   
    	width: 100
    	height: 100
    	color: "red"
	}
	//子元素2--文本
	Text {
   
   
    	text: "Hello World"
    	font.bold: true
    	font.pixelSize: 24
    	color: "red"
	}	
}

3.States状态

1)设置不同元素的状态,在根据不同事件选择对应状态
如下所示:设置矩形三种状态分别为normal、red_color、blue_color
鼠标无动作:normal、鼠标按下:red_color、鼠标松开:blue_color

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
   
   
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    Rectangle{
   
   
        id: root
        width: 100 ; height: 100
        state: "normal"  //调用名为red_color的状态
        states: [           //设置该矩形元素的状态
            State {
   
            //状态1
                name: "normal"   //normal //id:root;颜色:黑色
                PropertyChanges {
   
   target: root ; color:"black"}
            },
            State {
   
            //状态1
                name: "red_color"   //名称:red_color //id:root;颜色:红色;宽度200
                PropertyChanges {
   
   target: root ; color:"red";width:200}
            },
            State {
   
   
                name: "blue_color"
                PropertyChanges {
   
   target: root ; color:"blue";height:200}
            }
        ]
    }
    MouseArea{
   
         
<think> 我们被要求提供可用于打印的QML学习笔记。根据提供的引用资料,我们可以整理出一个结构化的学习笔记,包含QML的基本语法、结构、布局、信号和槽、函数属性等核心内容。同时,我们需要确保格式清晰,适合打印。 我们将按照以下结构组织笔记: 1. QML简介 2. QML基本结构 3. 导入模块 4. 对象声明与属性 5. 布局(锚布局) 6. 信号和槽 7. 函数属性(方法) 注意:由于是打印版,我们应避免使用代码块(但在文本中仍需清晰展示代码结构),并确保内容连贯。同时,我们将参考多个引用,并在适当位置添加引用标识。 开始整理: # QML学习笔记(可打印版) ## 1. QML简介 QMLQt Meta-Object Language)是一种用于创建高度动态应用程序的多范式语言。使用QML,可以声明诸如UI组件之类的应用程序构建块,并设置各种属性来定义应用程序行为。应用程序行为可以通过JavaScript进一步编写脚本,JavaScript是该语言的一个子集。此外,QML大量使用Qt,这允许直接从QML应用程序访问Qt的类型和其他Qt功能[^1]。 ## 2. QML基本结构 QML文档的基本结构由元素名、属性和子元素组成: ``` 元素名 { 属性名1: 属性值1 属性名2: 属性值2 ... 子元素1 { ... } 子元素2 { ... } ... } ``` 例如: ```javascript import QtQuick 2.12 import QtQuick.Window 2.12 Window { width: 640 // 宽 height: 480 // 高 visible: true // 是否可见 title: qsTr("Hello World") // 标题 // 子元素1:矩形 Rectangle { width: 100 height: 100 color: "red" } // 子元素2:文本 Text { text: "Hello World" font.bold: true font.pixelSize: 24 color: "red" } } ``` 在这个例子中,`Window`是根元素,它包含两个子元素:`Rectangle`和`Text`[^2]。 ## 3. 导入模块 在QML中,使用`import`语句导入模块。可以导入: - 已注册类型的版本化命名空间(如`import QtQuick 2.0`) - 包含作为QML文档的类型定义的相对目录(如`import "../privateComponents"`) - JavaScript文件(如`import "somefile.js" as Script`) 示例: ```javascript import QtQuick 2.0 import QtQuick.LocalStorage 2.0 as Database import "../privateComponents" import "somefile.js" as Script ``` 导入的模块提供了在QML中使用的类型和功能[^3]。 ## 4. 对象声明与属性 在QML中,对象通过声明其类型并设置属性来创建。每个对象都可以包含属性、信号、方法等。属性可以是基本类型(如int, string, color)或复杂类型(如其他对象)。 ## 5. 布局(锚布局) QML使用锚(anchors)对元素进行布局。锚定是基础元素对象的基本属性,可以被所有的可视化QML元素使用。锚就像协议,比几何变化更强大。锚是相对关系的表达式,通常需要与其他元素搭配使用[^4]。 示例: ```javascript Rectangle { id: rect1 width: 100; height: 50; color: "blue" } Rectangle { id: rect2 width: 100; height: 50; color: "red" anchors.top: rect1.bottom // rect2的顶部锚定在rect1的底部 } ``` ## 6. 信号和槽 信号和槽机制用于对象之间的通信。当某个对象的特定事件发生时,会发出信号,而槽是响应该信号的函数。 在QML中,可以使用以下方式连接信号和槽: - 使用`on<Signal>`语法(如`onClicked: { ... }`) - 使用`Connections`对象 示例: ```javascript Button { id: button onClicked: { // 当按钮被点击时执行 console.log("Button clicked") } } ``` ## 7. 函数属性(方法) 对象类型的方法是可以调用以执行某些处理或触发更多事件的函数。方法可以连接到信号,以便在发出信号时自动调用该方法。 定义方法有两种方式: - 在C++中注册一个类的函数到QML类型系统。 -QML文档中直接使用函数声明语法。 语法: ```javascript function 函数名([参数1[, 参数2, ...]]) [: 返回类型] { // 函数体 } ``` 注意:与信号不同,方法参数类型不必声明(默认为`var`类型),但建议声明以提高性能和可维护性[^5]。 示例: ```javascript import QtQuick 2.0 Rectangle { id: rect width: 100 // 定义一个计算高度的方法 function calculateHeight(): real { return rect.width / 2; } height: calculateHeight() // 使用函数计算高度 } ``` ## 总结 QML是一种声明性语言,用于构建流畅的用户界面。它结合了JavaScript的灵活性和Qt的强大功能,使得开发动态应用变得简单高效。 --- [^1]: QT开发学习笔记,环境搭建、QML [^2]: QT学习笔记-qml开发 [^3]: QML学习笔记 [^4]: QML学习笔记【02】:QML快速入门 [^5]: QTQML学习笔记2 §§相关问题§§ 1. QML中的锚布局(anchors)具体有哪些属性? 2. 如何在QML中导入和使用JavaScript文件? 3. 请解释QML中信号和槽的连接方式。 4. 如何优化QML应用的性能? </think> ### QML学习笔记(可打印版) #### **一、QML基础概念** 1. **QML定义** QMLQt Meta-Object Language)是一种用于创建动态应用程序的多范式语言。它通过声明式语法构建UI组件,支持属性绑定和JavaScript脚本,可直接访问Qt底层功能[^1]。 **核心特点**: - 组件化声明 - 属性驱动行为 - JavaScript脚本扩展 2. **基本结构** ```qml 元素名 { 属性名1: 属性值1 属性名2: 属性值2 子元素 { // 嵌套定义 } } ``` **示例**: ```qml Window { width: 640 // 宽度属性 height: 480 // 高度属性 visible: true // 可见性 Rectangle { // 子元素 color: "red" width: 100 } } ```[^2] --- #### **二、核心语法详解** 1. **导入模块** - 标准模块:`import QtQuick 2.12` - JavaScript文件:`import "utils.js" as Script` - 本地目录:`import "../components"` **注意**:版本号需与Qt安装版本匹配[^3]。 2. **属性声明** | 属性类型 | 示例 | |----------------|--------------------------| | 基础属性 | `width: 100` | | 绑定属性 | `height: width * 0.5` | | 颜色属性 | `color: "#FF0000"` | | 文本属性 | `text: qsTr("Hello")` | 3. **锚布局(Anchors)** - 相对定位元素的核心方法[^4]: ```qml Rectangle { anchors.centerIn: parent // 居中于父元素 anchors.left: sibling.right // 锚定到兄弟元素右侧 } ``` --- #### **三、进阶功能** 1. **信号与槽** - **信号定义**: ```qml signal mySignal(string message) ``` - **槽连接**: ```qml Button { onClicked: parent.mySignal("Clicked!") // 触发信号 } ``` 2. **函数属性** 动态计算方法: ```qml Rectangle { id: rect function calculateArea() { return width * height } Text { text: "面积:" + calculateArea() } } ```[^5] --- #### **四、开发实践** 1. **组件化设计** - 创建自定义组件 `MyButton.qml`: ```qml // 文件:MyButton.qml Rectangle { signal clicked Text { text: "按钮" } MouseArea { onClicked: parent.clicked() } } ``` - 主文件调用: ```qml MyButton { onClicked: console.log("按钮被点击") } ``` 2. **性能优化** - 避免过度嵌套布局 - 使用`Loader`动态加载组件 - 启用QML缓存机制(`qmlcache`) --- #### **引用来源** [^1]: QT开发学习笔记,环境搭建、QML [^2]: QT学习笔记-qml开发 [^3]: QML学习笔记 [^4]: QML学习笔记【02】:QML快速入门 [^5]: QTQML学习笔记2 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值