QML组件

news2025/7/2 22:22:49

一个QML文件定义了一个独立的、顶级的QML组件。

一个QML组件就是一个模板,被QML运行环境解释来创建一个带有一些预定义行为的对象。

一个独立的QML组件可以运行多次来禅城多个对象,每个对象都可以称为该组件的实例。

例子:

在项目中添加一个Mywidget.qml文件

添加以下代码:

import QtQuick 2.9

Rectangle{
    width: 100
    height:100
    Text{
        anchors.fill:parent
        font.bold: true
        font.pixelSize: 20
        text: "矩形"
    }
}

在main.qml中添加以下代码:

Column{
        spacing: 20
                     //创建了3个Mywidget组件
        Mywidget{
            id:widget1
        }
        Mywidget{
            id:widget2
        }
        Mywidget{
            id:widget3
        }
    }

任意的QML代码片段都可以称为一个组件,只需要将它放入一个 Xxxx.qml文件中,但必须以大写字母开头。

内联组件:

 内联组件使用Component元素声明,拥有常规顶级组件的所有特性。

内联组件并不会自动呈现和显示 :

Rectangle{
        width: 300
        height: 300
        color: "lightblue"
        Component{
            id:component1
            Rectangle{
                width: 100
                height: 100
                color: "green"
            }
        }
    }

 使用加载器加载:

Rectangle{
        width: 300
        height: 300
        color: "lightblue"
        Component{
            id:component1
            Rectangle{
                width: 100
                height: 100
                color: "green"
            }
        }
    }
    Loader{sourceComponent: component1}

 也可以为视图提供图形组件:

例如:使用ListView 中的delegate 来获取Component

Rectangle{
        width: 300
        height: 300
        color: "lightblue"
        Component{
            id:component1
            Rectangle{
                width: 100
                height: 100
                color: "green"
            }
        }
        ListView{
            anchors.fill:parent
            model: contactModel//显示的模型
            delegate:component1//代理
        }
    }

相当于:

Rectangle{
        width: 300
        height: 300
        color: "lightblue"
        
        ListView{
            anchors.fill:parent
            model: contactModel//显示的模型
            delegate:Rectangle{
                width: 100
                height: 100
                color: "green"
            }
        }
    }

在组件中添加属性、函数和信号

添加属性:

属性:可以在外部进行访问来修改一个对象,如Rectangle的width属性

  1. 一个属性就是一个QML组件中的一个值,可以被其他对象读取和修改
  2. 属性可以用于属性绑定,可以和其他属性同步修改

定义一个新属性的语法:

[default] property<type><name>[:defaultValue]
Rectangle{
        id:rect1
        property string image1: "qrc:/pix/ggg.png" //创建一个新属性
        width:200
        height: 200
        color: "lightBlue"
        Image {
            anchors.fill:parent
            source: rect1.image1//使用新属性
        }
    }

 QML常见的属性类型:

QML类型默认值C++(Qt)
int0int
boolfalsebool
double0.0double
real0.0double
string""QString
url""QUrl
color#000000(黑色)QColor
date未定义QDateTime
variant未定义QVariant

默认属性:

  1. 可以在声明属性时选default,可以使该属性成为默认属性
  2. 允许其他对象来指定默认属性值来作为子元素

Item元素默认属性为children属性:

Item{
        Rectangle{}
        Rectangle{}
    }

 如果children属性不是Item的默认属性的话,需要使用children[ ]

Item{
        children: [
            Rectangle{},
            Rectangle{}
        ]
    }

属性的别名:

属性别名是更高级的属性声明形式,属性别名不需要分配新的存储空间,可以通过别名来对属性进行操作。

别名的格式:类型被省略,但一定要加上alias关键词。

[dafault] property alias <name> :<alias reference>

alias关键字允许我们转发一个属性或者转发一个属性对象自身到另一个作用域

使用的注意事项: 

  1. 只有在指定它们的部件创建完时,别名才可用,在组件本身创建时不能直接使用别名属性
  2. 别名引用不能使用在同一个部件中声明的另一个别名属性
  3. 一个别名属性可以和现有的属性使用相同的名称
//只有在指定它们的部件创建完时,别名才可用,在组件本身创建时不能直接使用别名属性

property alias label:text1.text
alis:"GGGGG"//使用时text1.text还没定义


//别名引用不能使用在同一个部件中声明的另一个别名属性

id:root
property alias buttonText:textItem.text
property alias buttonText2:root.buttonText

//一个别名属性可以和现有的属性使用相同的名称
Rectangle{
  property alias color:childRect.color
  color:"red"
  Rectangle{id:childRect}
}
在这里color操作的都是childRect的color

例子:(添加一个Mywidget.qml文件)

import QtQuick 2.9
Rectangle{
    property alias label:text1 //起别名,使得另一个qml文件也可以访问
    width: 100
    height:100
    Text{
        id:text1
        anchors.fill:parent
        font.bold: true
        font.pixelSize: 20
        text: "矩形"
    }
}

在main.qml中创建一个Mywidget对象:

Rectangle{
        Mywidget{
            id:mywidget1
            label.text:"ppppppp"//通过别名访问Text中的内容
        }   
    }

添加函数

QML中可以使用JavaScript代码的函数,这些函数可以在内部调用,也可以被其他对象调用。

函数格式:

function <name>([<parameter name][,...])
{<body>}
  1. 声明可以出现在任何地方,但一般出现在顶部,方便查看
  2. 函数的参数类型为variant,所以不需要函数参数类型

无参函数 :

function fun1(){
        console.log("无参函数")
    }

有参函数:

function fun1(s1,s2){
        console.log("s1+s2为",s1+s2)
    }

有返回值的函数:

function fun1(s1,s2){
        return Math.max(s1,s2)//返回这两个的最大值
    }

常用的数学函数:格式:Math.xxx

添加信号

当一个事件发生时可以发射信号。信号的声明可以放到任意位置,但一般放置在开头。

信号格式为: 

signal <name>[([<type> <parameter name>[,...]])]

信号没有参数的话可以省略()

例子:

Item{
        signal click
        signal hovered()
        signal performAction(string action,variant actionArgument)
    }

连接的创建:on<SignalName>来命名,信号名的第一个字母要大写

//上面对应的槽函数
onClicked
onHovered
onPerformAction

 触发信号:直接调用函数即可

例子:创建一个Mywidget.qml

import QtQuick 2.9

Rectangle{
    id:rect1
    signal buttonClicked(int X,int Y)
    width: 100
    height:100
    MouseArea{
        anchors.fill:parent
        onClicked: {
            rect1.buttonClicked(mouse.x,mouse.y)//鼠标点击后,触发信号
        }
    }
}

 main.qml中添加

Mywidget{
        width: 100
        height: 100

        //槽函数
        onButtonClicked: { 
            console.log("鼠标位置为:"+X+","+Y);
        }
    }

将信号关联到其他函数和信号上

使用connect()函数,可以将一个信号关联到一个函数或者其他信号上

 创建一个Mywidget.qml:

import QtQuick 2.9

Rectangle{
    id:rect1
    signal buttonClicked(int X,int Y)
    width: 100
    height:100
    MouseArea{
        anchors.fill:parent
        onClicked: {
            rect1.buttonClicked(mouse.x,mouse.y)//鼠标点击后,触发信号
        }
    }
}

main.qml中添加:

Item{
        anchors.fill:parent
        id:item1
        function text1(){  //创建一个函数
            console.log("新的函数运行")
        }

        Mywidget{
            width: 100
            height: 100
            Component.onCompleted: buttonClicked.connect(item1.text1)//将信号关联到text1上
        }
    }

使用connections连接

on<SignalName>无法使用的情况:

  1.  需要对同一信号进行多次连接
  2. 在信号发送方范围之外创建连接
  3. 连接到QML未定义的目标

例子:Mywidget.qml

import QtQuick 2.9

Rectangle{
    id:rect1
    signal buttonClicked(int X,int Y)
    width: 100
    height:100
    MouseArea{
        anchors.fill:parent
        onClicked: {
            rect1.buttonClicked(mouse.x,mouse.y)//鼠标点击后,触发信号
        }
    }
}

main.qml

Item{
        anchors.fill:parent
        id:item1
        function text1(){  //创建一个函数
            console.log("新的函数运行")
        }

        Mywidget{
            id:my1
            width: 100
            height: 100
        }
        Connections{
            target: my1//关联到该控件
            onButtonClicked:{
                item1.text1()
            }
        }
    }

 

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

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

相关文章

Redis基础入门

文章目录前言一、redis是什么&#xff1f;二、安装步骤1.下载安装包2.安装三、Redis的数据类型redis是一种高级的key-value的存储系统&#xff0c;其中的key是字符串类型&#xff0c;尽可能满足如下几点&#xff1a;字符串(String)列表(List)集合(Set&#xff0c;不允许出现重复…

MySQL面试题-索引篇

1.什么是索引 MySQL的索引是一种数据结构&#xff0c;可以用于加快数据库中数据的查询速度。索引是基于表中一个或多个列的值排序的快速查找数据结构&#xff0c;可以大大提高查询效率。MySQL支持多种类型的索引&#xff0c;如B-tree索引、哈希索引、全文索引等。 索引可以在…

【java基础】异常处理(Exception)

文章目录基本介绍异常分类抛出异常非检查型异常检查型异常捕获异常捕获单个异常捕获多个异常创建自定义异常类finally字句try-with-Resource总结基本介绍 对于一个程序&#xff0c;总是有bug的。如果我们的程序遇到一个错误就终止了&#xff0c;那么肯定是不合理&#xff0c;程…

数据爬取(urllib+BeautifulSoup)

文章目录知识点总结爬虫步骤爬虫三要素爬虫注意事项python爬取技术学习网页抓取库Urllib网页解析库Beautifulsoup案例知识点总结 爬虫是一种按照一定规则&#xff0c;自动抓取互联网上网页中的相应信息的程序或脚本。 爬虫步骤 1.需求分析 2.找到要爬取信息的网站 3.下载reque…

基于halo后台管理+Gblog-wx搭建的微信小程序

先决条件 1、已经通过docker安装了halo后台管理系统(参考:http://43.136.39.20:8090/archives/halo-build) 2、安装的halo版本为1.5.3版本。此版本的halo才能安装小程序主题并启动小程序 3、需要修改小程序文件配置 解决安装的不是1.5.3的halo 1、如果是docker安装的halo…

蓝牙技术|蓝牙5.4标准正式发布,蓝牙ESL电子价签迎来一波利好

蓝牙技术联盟于2023年1月31日批准了蓝牙核心规范v5.4版本(以下简称蓝牙5.4版本)&#xff0c;并已正式公布。 蓝牙5.4版本引入了四个新特性&#xff0c;如下: 广播数据加密&#xff08;Encrypted Advertising Data&#xff09;&#xff1a;对广播数据进行加密以提高广播数据传…

[神经网络]Swin Transformer网络

一、概述 Swin Transformer是一个用了移动窗口的层级式Vision Transformer。 在图像领域&#xff0c;Transformer需要解决如下两个问题&#xff1a; ①尺度问题&#xff1a;同一语义的物体在图像中有不一样的尺度。(大小不同) ②Resolution过大&#xff1a;若以像素点作为单位&…

利用python写一个gui小公举--环境搭建

文章目录背景搭建环境安装必要库添加工具快捷方式检验背景 在实习过程中遇到一个问题&#xff0c;某项目是通过python代码实现的&#xff0c;而且需要一直修改参数实现功能&#xff0c;过程有些繁琐。虽然师兄用PHP study搭了一个网站用于查看结果&#xff0c;但是还是过于繁琐…

分布式新闻项目实战 - 12.热点文章-实时计算(kafkaStream)

死海效应&#xff1a; 公司发展到一定阶段后&#xff0c;工作能力强的员工&#xff0c;就会离职&#xff0c;因为他无法容忍公司的某些行为&#xff0c;即使辞职也很快会找到好工作&#xff1b;工作能力差的员工&#xff0c;却赖着不走&#xff0c;因为辞职以后也不太好找工作&…

JavaScript实现十大排序算法

目录 概览 一、冒泡排序 1、算法描述 2、图示 3、代码 二、选择排序 1、算法描述 2、图示 3、代码 三、插入排序 1、算法描述 2、图示 ​编辑 3、代码 四、希尔排序 1、算法描述 2、图示 3、代码 五、并归排序 1、算法描述 2、图示 ​编辑​编辑3、代码 …

食品与疾病关系预测赛题

和鲸平台数据分析实战 题目&#xff1a;食品与疾病关系预测算法赛道 一、赛题描述 食品与疾病关系预测算法赛道 越来越多的证据表明&#xff0c;食物分子与慢性疾病之间存在关联甚至治疗关系。营养成分可能直接或间接地作用于人类基因组&#xff0c;并调节参与疾病风险和疾病…

php结课报告--会员注册管理系统

目录 1&#xff0e; 系统背景及意义 1 2&#xff0e; 系统的设计思路 1 2.1 数据库设计分析 1 2.2 功能模块设计分析 1 3&#xff0e; 程序功能测试及截图 1 3.1代码测试与功能演示 1 4&#xff0e; 总结与收获 6 1&#xff0e;系统背景及意义 随着现在时代得发展&#xff0c;…

【AI面试】NMS 与 Soft NMS 的辨析

往期文章&#xff1a; AI/CV面试&#xff0c;直达目录汇总【AI面试】L1 loss、L2 loss和Smooth L1 Loss&#xff0c;L1正则化和L2正则化 一、NMS 非极大值抑制&#xff08;Non-Maximum Suppression&#xff0c;NMS&#xff09;&#xff0c;并不是深度学习时期&#xff0c;目标…

VS项目配置常用的配置

背景随着学习使用VS的深入在项目配置使用一些相对路径是必不可少的,使用绝对路径是最简单的,但是加入你换了电脑或者别人拉取你的代码,就会发现通常会编译不过.因为项目配置使用了绝对路径.所以使用相对路径的好处就会体现.在VS项目配置有自己的一套配置,简单记录一下我使用到的…

mysql一主键uuid和自增的选择

文章目录 1.自增ID的优缺点1.1 优点1.2 缺点1.3 不适合以自增ID主键作为主键的情况2.UUID作为主键2.1 介绍2.2 优点2.3 缺点3.有序UUID作为主键3.1 介绍3.2 演示使用3.2.1 前提知识3.2.1.1 数据类型 - binary3.2.1.2 函数 - hex()3.2.1.3 函数 - unhex()3.2.2 数据库层3.2.3 JA…

蓝桥杯第十四届校内赛(第三期) C/C++ B组

一、填空题 &#xff08;一&#xff09;最小的十六进制 问题描述   请找到一个大于 2022 的最小数&#xff0c;这个数转换成十六进制之后&#xff0c;所有的数位&#xff08;不含前导 0&#xff09;都为字母&#xff08;A 到 F&#xff09;。   请将这个数的十进制形式作…

提升Mac使用性能的5大方法,CleanMyMacX 2023非常的好用哦~

近些年伴随着苹果生态的蓬勃发展&#xff0c;越来越多的用户开始尝试接触Mac电脑。然而很多人上手Mac后会发现&#xff0c;它的使用逻辑与Windows存在很多不同&#xff0c;而且随着使用时间的增加&#xff0c;一些奇奇怪怪的文件也会占据有限的磁盘空间&#xff0c;进而影响使用…

sql数据库常用操作指令

一、操作库-- 创建库create database db1;-- 创建库是否存在&#xff0c;不存在则创建create database if not exists db1;-- 查看所有数据库show databases;-- 查看某个数据库的定义信息 show create database db1; -- 修改数据库字符信息alter database db1 character set ut…

Istio Sidecar启动顺序 - 导致的应用容器网络不通

目录一、问题二、Istio 1.7及其之后版本的解决方案2.1 方式1&#xff1a;安装Istio时全局设置2.2 方式2&#xff1a;在应用Deployment通过annotation设置2.3 holdApplicationUntilProxyStarts启用效果三、Istio 1.7之前的解决方案一、问题 线上应用集成了Spring Cloud K8S Con…

HCIP实验1

实验要求 1 R6为isp, 接口IP地址均为公有地址;该设备只能配置IP地址&#xff0c;之后不能冉对其进行其他任何配置; 2 R1-R5为局域网&#xff0c;私有IP地址192.168.1.0/24&#xff0c; 请合理分配; 3 R1, R2, R4,各有两个环回地址; R5; R6各有一个环回地址;所有路由器上环回均…