2.QML组件、图像几何变换和元素定位器
一、组件
组件是可重用的元素,QML提供了不同的方式来创建组件。 最简单的组件是基于文件的组件。 通过在文件中放置QML元素并为该文件指定元素名称(例如Button.qml)来创建基于文件的组件。 然后导入该组件后,就可以像使用QtQuick模块中的其他元素一样使用该组件。组件文件的文件名的首字母开头一定要大写!!!
示例
//Button.qml
import QtQuick 2.12Rectangle {id:buttonsizex:10y:10width:100height:30color: "red"border.color: "blue"property alias text: buttontext.text//自定义属性signal clickedText {id: buttontexttext: qsTr("button")anchors.centerIn: parent}MouseArea {anchors.fill: parentonClicked: {console.log("mouseare clicked")buttonsize.clicked()//触发clicked信号}}
}
Item {id: rootwidth: 320height: 240Button {id:button1x:100y:status.y-status.height-10text: "Start"onClicked: {console.log("onclicked in main qml")status.text = "Button clicked!"}}Text {id: statustext: qsTr("wait for pressing")//起始textelide: Text.ElideMiddlex:100y:100width: 150height: 40}
}
结果
上述代码在Button.qml中实现了一个组件button,在别的文件中,使用了该组件,当点击组件的mousearea时,会先触发组件的onclicked,并发出clicked信号,然后使用组件的文件中的onclicked相应该信号并修改text的状态,所以会先打印出qml: mouseare clicked,然后打印出qml: onclicked in main qml
组件类似于C++中的类。将类封装后,就可以使用类
二、元素几何变换
元素几何变换用于改变元素的几何形状。 QML可以对元素进行平移,旋转和缩放。x,y位置可以完成平移转换。 使用rotation属性实现旋转。 该值以度(0-360)为单位。 使用scale属性实现缩放,值<1表示元素按比例缩小,而值> 1表示元素按比例放大。 旋转和缩放不会更改几何形状。 x,y,width,height没有变。 只是绘画发生了变化。
示例
先定义一个图像组件
Image {id: rootsignal clickedMouseArea {id:mouseareaanchors.fill: parentonClicked: {root.clicked()}}
}
接着进行元素变换
Item {id: rootImage {id: bgsource: "./background.png"}width: bg.widthheight: bg.heightMouseArea {id:bgclickeranchors.fill:parentonClicked: {circle.x=84circle.y=84box.rotation=0triangle.scale=1}}Clickedimg {id:circlex:84y:68source: "./circle_blue.png"antialiasing: trueonClicked: {x+=20y+=20}}Clickedimg {id:boxx:164y:68source: "./box_green.png"antialiasing: trueonClicked: {rotation+=30}}Clickedimg {id:trianglex:248y:68source: "./triangle_red.png"antialiasing: trueonClicked: {scale+=0.1}}
}
效果如下
其中的antialiasing: true用于抗锯齿
此外,当三个元素彼此覆盖时,圆在最下,方形在中间,三角形在最上,因为Z方向的顺序和元素的代码的出现顺序有关。在代码中较早出现的元素具有较低的堆叠顺序(称为z方向顺序)。 z顺序也可以通过Item的z属性进行操作。鼠标区域的堆叠顺序也是如此。 在代码中较早出现的元素的鼠标区域将会被后出现的元素的鼠标区域覆盖。
三、元素的定位
定位器用来给qml元素进行位置锁定。QtQuick模块提供的定位器有Row, Column, Grid和Flow
示例
先实现三个颜色为红绿蓝的方块组件,代码如下
//Redsquare.qml
import QtQuick 2.0Rectangle {id:redsquarewidth: 50height: 50color: "red"border.color: Qt.lighter(color)//Qt.lighter(color)可以根据填充颜色产生较浅的边框颜色。
}
//Bluesquare.qml
import QtQuick 2.0Rectangle {id:redsquarewidth: 50height: 50color: "blue"border.color: Qt.lighter(color)//Qt.lighter(color)可以根据填充颜色产生较浅的边框颜色。
}
//Greensquare.qml
import QtQuick 2.0Rectangle {id:redsquarewidth: 50height: 50color: "green"border.color: Qt.lighter(color)//Qt.lighter(color)可以根据填充颜色产生较浅的边框颜色。
}
上述三个组件只不过颜色不同,其他完全相同,组件实现完后,分别演示四种定位器
1.Row
Rectangle {id:rootwidth: 320height: 240Row {id:rowanchors.centerIn: parentspacing: 15//控制元素的间距Redsquare {}Bluesquare {}Greensquare {}}
}
2.Column
Rectangle {id:rootwidth: 320height: 240Column {id:colanchors.centerIn: parent//元素位于父元素的中央位置spacing: 15Redsquare {}Bluesquare {width: 100}Greensquare {}}
}
定位器Row和Column的代码几乎都是一样的,Grid的代码略有不同;Grid通过设置rows和columns属性将元素排列在网格中。 如果不设置columns或rows,则根据columns或rows数量来计算另一个。 例如,将行设置为3并添加6个元素,那么列将自动为2。 属性flow和layoutDirection用于控制元素添加到Grid的顺序,而spacing还是控制元素的间距。
3.Grid
Rectangle {id:rootwidth: 320height: 240Grid {id:gridanchors.centerIn: parentspacing: 10columns: 2rows: 2Redsquare {}Redsquare {}Redsquare {}Redsquare {}}
}
4.Flow
Flow将元素添加到流中。 使用flow和layoutDirection属性元素的排列的方向。这样,元素可以横向或者纵向排列。将元素添加到流中时,可以根据需要,将它们包装起来形成新的行或列。 为了使Flow工作,必须具有宽度或高度。 可以直接通过属性设置,也可以通过锚定布局设置。
示例
Rectangle {id:rootwidth: 320height: 240Flow {anchors.fill: parentanchors.margins: 20spacing: 10flow: Flow.LeftToRight//flow: Flow.TopToBottomRedsquare{}Bluesquare {}Greensquare {}Redsquare {}}
}
flow属性如果不设置的话,默认就是Flow.LeftToRight,可以设置为Flow.TopToBottom,效果如下
其中的margin是关于布局的,后面再说
上述代码最多只添加了四个元素,但是,如果要添加100个元素总不能一个一个敲吧?和定位器经常一起使用的元素是Repeater。 Repeater类似一个for循环。 在最简单的情况下,Repeater只是通过model属性提供循环次数
示例
Rectangle {id:rootwidth: 250height: 250property var colorarray: ["red", "green", "blue"]Grid {id:gridanchors.fill: parentanchors.margins: 15spacing: 5Repeater {model: 16Rectangle {width: 50height: 50property int colorindex: Math.floor(Math.random()*3)color: root.colorarray[colorindex]border.color: Qt.lighter(color)Text {id: nametext: qsTr("ceil")+indexcolor: "white"anchors.centerIn: parent}}}}
}
对于每个循环,Repeater都会创建一个方块。 在方块中,通过JS的函数Math.floor(Math.random()* 3)选择颜色。 Math.random()的返回值是一个大于等于0小于1的随机数,所以floor(Math.random()* 3)向下取整,提供了一个介于0-2之间的随机数,因此可以从颜色数组中选择颜色。 此外,循环时,Repeater将会生成index。 它包含当前的循环索引(0,1,.. 15)。
显示结果如下
参考
《qml book》
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出
2.QML组件、图像几何变换和元素定位器相关推荐
- 1.QML语法、属性和元素
QML是一种声明性语言,用于描述应用程序的用户界面.QML可以将用户界面分解,也可以将界面元素组合为组件. QML描述了这些用户界面元素的外观和行为. 支持JavaScript来丰富此用户界面描述,以 ...
- Qt 学习之路 2(79):QML 组件
前面我们简单介绍了几种 QML 的基本元素.QML 可以由这些基本元素组合成一个复杂的元素,方便以后我们的重用.这种组合元素就被称为组件.组件就是一种可重用的元素.QML 提供了很多方法来创建组件.不 ...
- [练气期]计算机视觉之从矩阵本质修炼图像几何变换秘籍
[练气期]计算机视觉之从矩阵本质修炼图像几何变换秘籍 练气期,我们需要掌握哪些图像处理知识? 掌握OpenCV和图像处理的基础知识,并进行实践操作,具体包含: 为什么选择OpenCV,OpenCV是什 ...
- [Python从零到壹] 三十九.图像处理基础篇之图像几何变换(镜像仿射透视)
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- 【Qt】QML快速入门7——输入元素
QML快速入门 [Qt]QML快速入门1--语法:https://blog.csdn.net/See_Star/article/details/113729827 [Qt]QML快速入门2--基本元素 ...
- 图像几何变换--缩放、平移、镜像、旋转
目录 一.图像几何变换基础 二.平移 三.缩放 四.旋转 五.镜像 六.复合变换 七.变换矩阵总结 八.完整代码 一.图像几何变换基础 1.图像的几何变换是指原始图像按照需要产生大小.形状和位置的变化 ...
- [Python从零到壹] 三十八.图像处理基础篇之图像几何变换(平移缩放旋转)
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- Python图像处理丨带你掌握图像几何变换
摘要:本篇文章主要讲解图像仿射变换和图像透视变换,通过Python调用OpenCV函数实. 本文分享自华为云社区<[Python图像处理] 十二.图像几何变换之图像仿射变换.图像透视变换和图像校 ...
- 图像几何变换时为何要用到插值算法?_计算机视觉方向简介 | 图像拼接
作者戴金艳,公众号:计算机视觉life, 编辑部成员. 更好的阅读体验请看首发原文链接计算机视觉方向简介 | 图像拼接 简介 图像拼接是将同一场景的多个重叠图像拼接成较大的图像的一种方法,在医学成像. ...
最新文章
- Java多线程高并发学习笔记(一)——ThreadRunnable
- Python Matplotlib基本用法
- 扩展iQuery使其支持多种编程语言(二) – 兼编译器的语法分析简介
- 容器源码分析之ArrayList(二)
- 产品经理如何做好信息架构
- leetcode - 375. 猜数字大小 II
- TCA9548A iic地址扩展器件 树莓派JAVA版教程
- 《消费者报告》下调特斯拉Model 3安全评级
- linux6 安装oracle11g
- php生成随机汉字,PHP随机生成中文段落示例【测试网站内容时使用】
- 织梦index.php不更新,亲测dede织梦后台无法更新生成,更新没反应的解决方法
- Android 蓝牙驱动专题分析(2)--- 蓝牙驱动代码流程、kernel dump、tombstone问题分析
- 【无标题】RC抽取工艺文件(三)Layer map错误
- git clone之报错git@gitee.com: Permission denied (publickey).fatal: Could not read from remote repositor
- 汽车车灯注塑件三维尺寸公差检测
- 【IoT】加密与安全:动态密码 OTP 算法详解
- python怎样编程_怎么自学python编程
- Vue CLI构建SPA项目教你手把手创建SPA项目
- vue打开新窗口并且实现传参,有图有真相
- 3D建模中的BIP骨骼镜像对称画是什么东西?