QML基础

news2024/12/29 13:34:09

从 Qt 4.7 开始,Qt 引入了一种声明式脚本语言,称为 QML(Qt Meta Language 或者 Qt Modeling Language),作为 C++ 语言的一种替代。而 Qt Quick 就是使用 QML 构建的一套类库。 QML 是一种基于 JavaScript 的声明式语言。
 

每一个 QML 有且只有一个根元素,

一个 QML 文档分为 import 和 declaration 两部分。

qml的打印

使用:console.log(打印的字符串,打印的参数)

 

元素

基础元素

根元素

每一个QML文件都需要一个根元素,并且只能有一个根元素。

window

Opacity---透明度

值在0~1之间

属性改变时会触发对于的属性改变槽函数

 组件中的任何属性(包括自定义属性),都有改变时触发的槽函数

Item

属性和值

对于元素具有哪些属性可以直接查看QT帮助文档,让后进行设置就可以。

属性和属性可以设置的值都是已经定义好的,我们要做的就是知道属性和属性值的设置。

id

可以通过组件的id访问组件

x和y,z

相对于屏幕左上角

z为正数就靠平面前面

width和heigth

有这两个属性的组件,如果不设置这两属性,组件不显示。

focus

焦点

焦点所在对象就是要控制的对象;

如果对象没有获取焦点,是不能(键盘或者鼠标)被控制的。

 

锚点(anchor)

设置一个元素或者组件的位置可以设置x,y,z,也可以通过锚点设置。

位置指定

Text {

         text: qsTr("Hello World")

         anchors.centerIn: parent

}

设置元素位置方式

1,x,y,z

2,anchors

rotation--旋转

顺时针旋转

scale---改变大小

width和heigth乘以指定的倍数

 

rectangle的gredient

设置颜色渐变

rectangle单边框设置

需要设置内外两个rectangle,通过设置margin(边缘)来设置两个rectangle的边缘宽度。

自定义组件:

import QtQuick 2.0

Rectangle{
    id:root
    width: 200
    height: 100

    color: "#ff3300"
    //border.color: "#4c8dae"

    property int m_topMargin: 0
    property int m_bottomMargin: 0
    property int m_leftMargin: 0
    property int m_rightMargin: 0

    Rectangle{
        id: innerRect
        anchors.fill: parent
        color: "#ae7000"

        anchors.topMargin: m_topMargin
        anchors.bottomMargin: m_bottomMargin
        anchors.leftMargin: m_leftMargin
        anchors.rightMargin: m_rightMargin
    }
}

main.qml调用

import QtQuick 2.6
import QtQuick.Window 2.2

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

    MyRectangle{
        //id:myRect
        x:200
        y:200
//        width: 200
//        height: 100

        m_topMargin: 10
        m_bottomMargin: 10
    }
}

state---states:[ ]

state

属性指定组件当前是使用哪个状态的属性。

states:[ ]

中指定这个组件的多种state(状态);

我们可以在states中设置组件的多种状态,在需要的不同时刻设置组件的state属性为states中的对应状态。

name是状态的名字;

PropertyChanges中可以设置这个状态的属性;

自定义文件中设置属性:

import QtQuick 2.0

Rectangle{
    id:root
    width: 200
    height: 100

    color: "#ff3300"
    //border.color: "#4c8dae"

    property int m_topMargin: 0
    property int m_bottomMargin: 0
    property int m_leftMargin: 0
    property int m_rightMargin: 0

    Rectangle{
        id: innerRect
        anchors.fill: parent
        color: "#ae7000"
        state: "normal"

        anchors.topMargin: m_topMargin
        anchors.bottomMargin: m_bottomMargin
        anchors.leftMargin: m_leftMargin
        anchors.rightMargin: m_rightMargin

        states: [
            State {
                  name: "normal"
                  PropertyChanges {target: innerRect; color:"#ae7000"}
            },
            State {
                  name: "red_color"
                  PropertyChanges { target: innerRect; color: "red" }
            },
            State {
                  name: "blue_color"
                  PropertyChanges { target: innerRect; color: "blue" }
            }
        ]
        MouseArea{
            anchors.fill: parent

            onPressed: {
                innerRect.state="red_color"
            }
            onReleased: {
                innerRect.state="blue_color"
            }
        }
    }

}

动画效果属性

动画有8种类型

propertyAnimation

 PropertyAnimation支持所有属性

sequentialAnimation

可持续多个动画效果

 

动画效果的两种实现方法

1,将动画效果设置为组件的属性

需要执行动画的时候,动画名.start()就开启属性。

Rectangle {
      id: flashingblob
      width: 75; height: 75
      color: "blue"
      opacity: 1.0

      MouseArea {
          anchors.fill: parent
          onClicked: {
              animateColor.start()
              animateOpacity.start()
          }
      }

      PropertyAnimation {id: animateColor; target: flashingblob; properties: "color"; to: "green"; duration: 100}

      NumberAnimation {
          id: animateOpacity
          target: flashingblob
          properties: "opacity"
          from: 0.99
          to: 1.0
          loops: Animation.Infinite
          easing {type: Easing.OutBack; overshoot: 500}
     }
  }

弊端:

即使是同类型的动画效果也要设置在各自的动画属性中:

 

2,on某个属性

在需要产生动画的位置直接开启动画

    Rectangle {
          id: rect
          width: 100; height: 100
          color: "red"

          PropertyAnimation on x {
              to: 200;
              duration: 1500
          }
          PropertyAnimation on y {
              to: 100
              duration: 1500
          }
          NumberAnimation on width{
              to:300
              duration: 1500
          }
    }

transitions---states

transitions中指定states中状态变换,并且实现动画效果。

不需要开启transitions中的转变,只要指定的状态发送改变transitions就会自动执行。

Rectangle {
          width: 75; height: 75
          id: button
          state: "RELEASED"

          MouseArea {
              anchors.fill: parent
              onPressed: button.state = "PRESSED"
              onReleased: button.state = "RELEASED"
          }

          states: [
              State {
                  name: "PRESSED"
                  PropertyChanges { target: button; color: "#801dae"}
              },
              State {
                  name: "RELEASED"
                  PropertyChanges { target: button; color: "#dc3023"}
              }
          ]

          transitions: [
              Transition {
                  from: "PRESSED"
                  to: "RELEASED"
                  ColorAnimation { target: button; duration: 1500}
              },
              Transition {
                  from: "RELEASED"
                  to: "PRESSED"
                  ColorAnimation { target: button; duration: 1500}
              }
          ]
      }

自定义属性

添加自己定义的属性需要使用property修饰符,然后跟上类型,名字和可选择的初始化值(property : )。如果没有初始值将会给定一个系统初始值作为初始值。注意如果属性名与已定义的默认属性名不重复,使用default关键字你可以将一个属性定义为默认属性。这在你添加子元素时用得着,如果他们是可视化的元素,子元素会自动的添加默认属性的子类型链表(children property list)

组件---component

为什么需要组件

组件的常用槽函数

onCompleted()

窗口创建的时候触发

onDestruction()

窗口销毁时触发 

component中创建组件是不会被自动创建的

需要Loader加载控件

通过source加载:source+元素路径

 sourceComponent:+组件id

sourceComponent=null时loader加载的组件将被销毁

 

import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Controls 1.4

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

    Component{
        id:m_comp
        Rectangle{
            id:comp_rect
            width:100
            height: 100

            color: "#a98175"
            Component.onCompleted: {
                console.log("create");
            }
            Component.onDestruction: {
                console.log("destructed");
            }
        }
    }
    Loader{
        id:loader
        //source: "/MyRectangle.qml"
        sourceComponent: m_comp
        onStatusChanged: {
            console.log("loader status:",status);
        }
    }

    Button{
        id:button
        x:300
        y:300
        width:100
        height: 100
        onClicked: {
            loader.sourceComponent=null;
        }
    }
}

 怎么获取component

loader的id加上item---loaderId.item返回组件根元素

Loader的异步--asynchronous

此属性保存组件是否将异步实例化。默认情况下,该属性为false。
当与源属性一起使用时,加载和编译也将在后台线程中执行。异步加载将创建组件跨多个框架声明的对象,并降低动画中的故障。当异步加载时,状态将更改为Loader.Load。一旦创建了整个组件,项目将可用,状态将更改为Loader.Ready。在进行异步加载时,将此属性的值更改为false将强制立即同步完成。如果必须在异步加载完成之前访问Loader内容,这允许开始异步加载,然后强制完成。
 

anchors怎么设置组件中根元素的位置

Image元素

 

Image元素属性

source加载图片

AnimatedImage加载动态图

image只能加载静态图片

属性

暂停,是否播放等

MouseArea

鼠标

设置鼠标可控范围:

anchors.fill

 mouseArea的属性

clicked=pressed+released

mouseArea的acceptedButton默认是左键,怎么设置右键

pressButtons属性记录鼠标键值

怎么获取鼠标的左右中键值

多条件联合判断

组件检测鼠标悬浮

containsPress属性记录鼠标是否按下

containsMouse记录鼠标是否存在MouseArea区域内

containsMouse和hoverEnble有关

按下可检测

   MouseArea{
        width: 200
        height: 200

        acceptedButtons: Qt.AllButtons
        Rectangle{
            id:mouse_rect
            anchors.fill: parent
            color: "#a4e2c6"
        }
        onContainsMouseChanged: {
            console.log("Mouse cursor status:",containsMouse);
        }
        onContainsPressChanged: {
            console.log("Press status:",containsPress);
        }
    }

 悬浮可检测

 

   MouseArea{
        width: 200
        height: 200

        acceptedButtons: Qt.AllButtons
        hoverEnabled: true //设置悬浮使能
        Rectangle{
            id:mouse_rect
            anchors.fill: parent
            color: "#a4e2c6"
        }
        onContainsMouseChanged: {
            console.log("Mouse cursor status:",containsMouse);
        }
        onContainsPressChanged: {
            console.log("Press status:",containsPress);
        }
    }

信号和槽函数

信号的定义:

signal 信号函数名()

信号触发(槽函数):

on+信号函数名:{}

信号函数名首字母大写

键盘触发的槽函数

Keys.槽函数

 

函数

qstr()

qsTr()函数就是 QObject::tr()函数的 QML 版本,用于返回可翻译的字符串。

怎么添加qml文件

qml文件的调用原理

项目入口是main.qml文件,文件中使用window组件实现基础的窗口。

其他自定义的文件就相当于自己定义的一个组件,可以在自定义文件中设置这个自定义组件的属性,然后在main.qml文件中通过调用自定义文件名调用自定义组件,在调用中设置自定义文件中设置的属性。

main.qml中调用的自定义组件不要再加id属性,因为main中就是使用,而不是定义了。

 main.qml调用其他文件元素和组件

qml项目运行的是main.qml文件,其他文件元素和组件要运行需要在main.qml中调用

在main.qml中直接调用其他qml文件的文件名,就会运行被调用文件中的设置。

 

为什么自定义文件中定义的属性不显示出来

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

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

相关文章

Qt下存储读写应用程序设置的三种方法

一、简介 List item 用户对应用程序经常有这样的要求:要求它能记住它的settings,比如窗口大小、位置和密码等等。有三种方法可以实现: 使用注册表;使用配置文件(.ini);使用自定义文件(例如.txt)。 二、使用注册表 …

C盘空间不足清理方法 之 Google Chrome 浏览器用户数据迁移和Windows10 默认浏览器路径失效修复

原理分析 将原来C盘的目录拷贝到其他盘,然后用mklink建立一个联接,这里贴下ChatGPT对于三种链接的解释 # 在Windows 10中,mklink是一个命令行工具,用于创建符号链接(symbolic link)或者硬链接&#xff08…

chatgpt赋能python:Python异常过滤教程:如何正确处理和过滤Python中的异常

Python异常过滤教程:如何正确处理和过滤Python中的异常 介绍 Python是一种非常流行的编程语言,广泛应用于各种应用程序和领域中。在我们编写Python程序的过程中,通常要处理各种异常情况,比如用户输入错误,文件读取错…

CSS查缺补漏之《Web字体、2D/3D变换》

文章略长,慢慢享用~ Web字体 css3新增了字体,使得用户不必局限在本计算机中安装的字体,可以使用多种字体; 需要在style中定义font-face规则; font-face { font-family: xxx名字; /* 必选项,自…

ROS2 入门应用 创建启动文件(Python)

ROS2 入门应用 创建启动文件(Python) 1. 创建功能包2. 添加依赖关系3. 添加启动文件4. 创建启动文件4.1. Python4.2. XML4.3. YAML 5. 编译和运行 1. 创建功能包 用Python、XML或YAML编写的启动文件可以启动和停止不同的节点,以及触发和处理…

设计模式(二十三):行为型之解释器模式

设计模式系列文章 设计模式(一):创建型之单例模式 设计模式(二、三):创建型之工厂方法和抽象工厂模式 设计模式(四):创建型之原型模式 设计模式(五):创建型之建造者模式 设计模式(六):结构型之代理模式 设计模式…

chapter8:SpringBoot启动配置原理

尚硅谷SpringBoot顶尖教程 1. 启动流程简介 SpringBoot应用从主启动类启动后的运行流程主要包含下面几个要点: (1)准备环境 执行ApplicationContextInitializer#initialize()方法;监听器SpringApplicationRunListener回调cont…

ADC 读取电位器旋钮,用回差消除临界值档位跳动

就是比如,用电位器当旋钮做风扇调速,划分出10 个速度档位,对应10 个ADC 转换结果的阈值。如果直接比较阈值,当旋钮拧到临近阈值的地方时,ADC 结果的微小跳动会导致风扇档位在两个级别之间不停左右横跳,因此…

Linux MySQL 索引 事务 存储引擎 死锁

索引(面试问得多) 索引是一个排序的列表,包含索引字段的值和其相对应的行数据所在的物理地址 作用 加快表的查询速度,还可以对字段排序 如何实现的搜索加速? 没有索引的情况下,要查询某行数据,需…

代码审计——命令执行详解

为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 漏洞描述02 审计要点03 漏洞特征04 漏洞案例05 修复方案 01 漏洞描述 命令注入是指因为系统使用了可以执行命令的危险函数,但是调用这些函数的参数可控,并没有做过滤或过滤不…

Flutter集成Umeng步骤及若干问题总结

由于Flutter项目中用到umeng统计及手机号一键登录功能,但实际集成使用中遇到各种坑,文档及demo却都没有提及,因此写下这篇文章,有遇到同样问题的同学可以参考下。 集成之前,最好先查看一下文档:https://de…

LangChain for LLM Application Development 基于LangChain开发大语言应用模型(上)

以下内容均整理来自deeplearning.ai的同名课程 Location 课程访问地址 DLAI - Learning Platform Beta (deeplearning.ai) 一、什么是LangChain 1、LangChain介绍 LangChain是一个框架,用于开发由大语言模型驱动的应用程序。开发者相信,最强大的、差异…

Ubuntu+Pycharm+QtDesigner,并配置Pyqt5

1. 安装PyQt5 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyqt5 2. 安装ubuntu环境下所需要的依赖包 sudo apt install pyqt5* 3. 安装QtDesigner sudo apt install qttools5-dev-tools 4. 设置Pycharm 步骤: File–>setting–>Tools–&…

ESP32设备驱动-VCNL4040趋近传感器

VCNL4040趋近传感器 文章目录 VCNL4040趋近传感器1、VNCL4040介绍2、硬件准备3、软件准备4、驱动实现1、VNCL4040介绍 VCNL4040 将趋近传感器 (PS)、环境光传感器 (ALS) 和高功率 IRED 集成到一个小型封装中。它通过CMOS工艺将光电二极管、放大器和模数转换电路集成到一个芯片…

Linux->线程库接口

目录 前言: 1 进程和线程 2 线程库接口 2.1 线程库基础理解 2.2 创建线程 2.2 线程资源回收 2.3 线程分离 前言: 本篇主要是对Linux原装线程库的函数接口进行学习,还有一部分的线程概念补充。 1 进程和线程 博主在上一篇文章当中有讲过…

中北大学 - 信息对抗大三下学习课程设计(爬取招标网站,进行招标分析,数据保存execl中)

文章目录 1. 题目描述2. 项目细节分析定时爬取任务思路避免多次爬取数据重复问题网站结构根据爬取信息确认招标地区 3. 项目代码4. 运行截图 1. 题目描述 中北大学信息安全技术爬虫课程设计 题目 5:招投标信息分析系统 (20050441 2005031113&#xff09…

Floyd算法图解,C++实现Floyd算法

Floyd算法简介 Floyd算法是一种多源最短路径算法,是利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特弗洛伊德命名。 时间复杂度&am…

Python模块multiprocessing 实现多进程并发

简介 multiprocessing模块是Python标准库中提供的一个用于实现多进程编程的模块。它基于进程而不是线程,可以利用多核CPU的优势,提高程序的执行效率,同时也可以实现进程间通信和数据共享。 目录 1. 参数说明 1.1. Process(控制进…

推荐系统初谈

文章目录 简介推荐系统与搜索引擎发展历史所属领域 推荐系统分类概览基于内容的推荐基于协同过滤的推荐基于内存的协同过滤基于模型的协同过滤基于矩阵分解的推荐 推荐系统的评价指标推荐系统存在的问题参考文献 简介 21年笔记迁移,主要介绍了推荐系统的定义、发展…

【IC设计】ICC1 workshop lab guide 学习笔记

文章目录 Lab1 Data Setup&Basic Flow1.1 Create a Milkyway library1.2 Load the Netlist,TLU,Constraints and Controls1.3 Basic Flow:Design Planning1.4 Bsic Flow:Placement1.5 Basic Flow:CTS1.6 Basic Flow:Routing Design Planning2.1 Load the Design2.2 Initial…