Qt_Quick开发实战精解_3

事件处理:
qml中如故一个事件想要能够被单击,就要在其上放置一个MouseArea元素
signal: onClicked() onDoubleClicked() onPressed() onReleased() onPressAndHold()

Rectangle{
width:600
height:800
color: "green"
MouseArea{
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton
onClicked:{
if(mouse.button == Qt.RightButton)
parent.color = ‘blue‘
else if ((mouse.button == Qt.LeftButton) && mouse.modifiers & Qt.ShiftModifier)
parent.color = "green"
else
parent.color = ‘red‘
}
}
}

drag:分组属性 drag.target: 指定目标 drag.active: 获得拖拽目标信息 drag.axis: 指定方向

Rectangle{
id: container
width: 600
height: 800
Rectangle{
id: rect
width: 50
height:50
color: "red"
opacity:(600.0-rect.x)/600 透明度
MouseArea{
anchors.fill: parent
drag.target: rect
drag.axis: Drag.XAxis 水平方向
drag.minimumX:0
drag.maximumX: container.width-rect.width
}
}
}

按键处理:
Qt获得键盘动作产生键盘事件--> Qt部件具有焦点 接受事件---> 场景将事件交给具有焦点的qml项目--->具有焦点的qml项目接受事件--->传播停止

Rectangle{

width: 100
height: 100
focus: true

Keys.onPressed:{
if(event.key == Qt.Key_A)
{
console.log("Key A Was pressed");
event.accepted = true 防止事件项上层项目传播

}
}
}

KeyNavigation:元素

Grid{
width: 200
height: 200
columns: 2
Rectangle{
id: topLeft
width: 50
height: 50
color: focus ? "red": "lightgray"
focus: true
KeyNavigation.right: topRight
KeyNavigation.down: bottomLeft
}
Rectangle{
id: topRight
width:50
height:50
color: focus ? "red": "lightgray"
KeyNavigation.right: topLeft
KeyNavigation.down: bottomRight
}

Rectangle{
id: bottomLeft
width: 50;height: 5
color: focus ? "red": "lightgray"
KeyNavigation.right: bottomRight
KeyNavigation.up: topLeft

}
Rectangle{
id: bottomRight
width: 50;height: 50
color: focus? "red" : "lightgray"
KeyNavigation.left: bottomLeft
KeyNavigation.up: topRight

}

查询活动焦点项目
It
em::activeFocus 属性

radius: 10 半径 smooth: true 光滑的

焦点的作用域:
FocusScope{
需要绑定道子项目的可视属性上

property aliase color: rectangle.color

x: rectangle.x; y: rectangle.y
width: rectangle.width;height: rectangle.height
Rectangle{
id: widget
color: "lightsteelblue";width: 175;height: 255 radius: 10; smooth:true
Text {id: label;anchors.centerIn: parent}
focus: true
Keys.onPressed:
{
if(event.key == Qt.Key_A)
label.text = "Key A was pressed"
else if (event.key == Qt.Key_B)
label.text = "Key B was pressed"
else if (event.key == Qt.Key_C)
label.text = "Key C was pressed"

}
}
}
当作为一个可重用或则被导入的组件时 焦点失效

Recttangle{
id:window
color: "white";width : 240;height: 150
Column{
anchors.centerIn:parent; spacing: 15
MyWidget{ 获得焦点
focus:true
color: "lightblue"

}
MyWidget{ 未获得焦点
color: "palegreen"
}
}
}

定时器
Item {
Timer{
interval: 500 设置时间间隔
running: true;
repeat: true 是否重复触发
onTriggered: time.text = Date().toString()信号
}
Text{
id: time
}
}

使用loader动态加载组件

Item{
width: 400;height: 400
Loader{id: pageLoader}
MouseAera{
anhors.fill: parent
onClicked: pageLoader.source = "Page.qml"
}
}

Connections:元素接受信号

Item{
width:100
height:100
Loader{
id: myLoader
source: "MyWidget.qml"

}
Connections{ 连接
target: myLoader.item
onMessage: console.log(msg)
}
}

Rectangle{
id: myItem
signal message(string msg)

width: 100;height:100

MouseArea{
anchors.fill: parent
onClicked: myItem.message("Clicked!") 转发信号
}
}
Loader 是一个焦点作用域,对于它的任何获得活动焦点的子项目都必须将 focus设置为true

Redtangle{
width:200
height: 200

Loader{
id: loader
focus:true

}
MouseArea{
anchors.fill: parent
onClicked: loader.source = "KeyReader.qml"

}
Keys.onPress:{
console.log("Captured:",event.text)
}
}

Item{
Item{
focus: true
Keys.onPressed:
{
console.log("Loader item captured",event.text) 获得按键
event.accepted = true 防止事件传到外层
}
}}

图形和动画

Gradient:渐变 GradientStop子项目

Rectangle{
width: 100
height: 100
gradient: Gradient{
GradientStop{position:0.0;color: "red"}
GradientStop {position: 0.33;color: "yellow"}
GradientStop{positon:1.0;color: "green"}
}
}

只有在垂直线性渐变可以使用,如 果需要使用不同方向的渐变,可以结合旋转和裁剪操作来实现 .

Image 元素:来声明显示图片 fillMode:对图片拉伸和平铺

Image{

id: iamge
width: 120;
fillMode:Image.Title
source: "qtlogo.png"
}

Image{
id:image
width:120;height:120
fillMode:Image.Title
source:"http://www.baidu.com/img/baidu_sylogol.gif"
onStatusChanged:{
if(image.status == Image.Ready) console.log(Loaded)
else if (image.status == Image.Loading) console.log(loading)
}
}

BorderImage
{
width: 180
height: 180
border{left:30; top:30; right: 30;bottom:30}
horizontalTileMode: BorderImage.Stretch
//水平方向和垂直方向的平铺模式都设置为拉伸
verticalTileMode: BorderImage.Stretch

source: "color.png"
}

Rectangle{
width: animation.width; height: animation.height+8
AnimatedImage{id:animation;source: "color.png"} 没有gif图片 没有实现效果
Rectangle{
property int frames: animation.frameCount
width: 4; height:8
x: (animation.width-width)*animation.currentFrame/frames
y: animation.height
color: "red"
}
}

scale: 属性 缩放 rotation属性: 旋转

Rectangle{
color: "red"
x:25;y25;width: 25;height:25
scale: 1.6
transfromOrigin: "TopLeft"
}

Item 还有一个 transform 属性,需要指定一个 Transform 元素的列表. Trans-form 元素是一个基本类型,无法被直接实例化,可用Transform 类型有 3 个 .Ro­tation 、 Scale 和 Translate ,分别用来进行旋转、缩放和平移。这些元素可以通过专门的属性来进行更加高级的变换
设置 .Rotation 提供了坐标轴和原点属性,坐标制有 aXls. X 、 axis. y 和 aXls. Z 分别代表 X 轴、 Y 输和 Z 辙,也就是说可以实现 3D 效果.原点自 origin. X 和 ongm. y 来指定.简单的 2D 旋转是不需要指定坐标轴的,默认使用 Z 轴 (axis { x : 0; y: 0 ; Z: O}) 即可。对于典型的 3D 旋转,既需要指定原点,也qr,;要指定坐标轴。图 6 - 32 为原点和坐标轴的设置示意图.使用 angle 属性以指定顺时针旋转的度数 .下面 的代码将一个蓝色矩形以 Y 割IJ 为旋转轴进行了旋转.

Rectangle{
color: "red"
width: 250;height:250
scale: 1.6
transform: Rotation {origin.x: 30;origin.y:30;axis{x:0;y:1;z:0}angle:72}
}

Row{
Rectangle{
width: 100;height: 100;color: "blue"
transform: Translate{y:20} 简单理解为改变的意思切换

}
Rectangle{
width: 100;height: 100;color:"red"
transform: Translate{y:-20}
}
}
用户界丽用来显示不同场景中的界面,在 QML 中,任何对象都可以在不同的状态间变化,每一个状态中都可以修改相关项目的属性来显示一个不同的配置,对于不是 ltem 派生的对象可以通过StateGroup 元素来使用状态可以向项目的 states 属性添加一个 State 对象, states 底性包含了该项目状态的列表。

Rectangle{
id: rect
width: 100 height:100
color: "red"
MouseArea{
anchors.fill: parent
onClicked: myRect.state = moved
}
states:{
State{ 项目
name: "moved"
修改对象的属性
PropertyChangs{target: rect;x:50;y:50}
}
}
}

State 不仅限于对属性值进行修改,它还可以:
》 使用 Sta teChangeScript 运行一些脚本;
》 使用 Prop ertyChanges 为 一个对象军写现有的信号处理苦苦;
〉 使用 PropertyChanges 为 一 个项目重定义父项目;
〉 使用 AnchorChanges 修改锚的值.

when: 属性
当鼠标点击时移动 释放时还原
states: State{ name: "moved";when: mouseArea.pressed }

空字符串表示默认状态: onReleased : myRect.state = ""

,可以在对象的属性值上应用动面对象来随着时间逐渐改变它们从而创建动画。
动画被应用为属性值源 (propertyvaluesource) ,要使用"动画 on属性"语法。

Rectangle{
propertyAnimation on x {to: 50;duration: 1000;loops: Animation.Infinite}这星的 loops 属性指定为Animation. Infinite ,表明该动画是无限循环的.
}

Behavior为一个属性值改变执行一个默认的动画:

Item{
Rectangle{
id:rect
width: 100;height: 100;color: "blue"

Behavior on x {PropertyAnimation{duration: 1000}}

}
MouseArea{
anchors.fill: parent
onClicked: {rect.x = mouse.x;}
}
}

在信号处理器中创建动画: onClicked: PropertyAnimation{target: rect; properties:"x,y";to: 50;duration : 1000}

独立动画: 不需要绑定任何特定的对象和属性;PropertyAnimation对象

PropertyAnimation{
id: animation
targrt: rect
properties: "x,y"
duration: 100
}

onClicked: {
animation.to = 50 作为独立对象
animation.running = true 独立对象没用运动 可以使用: running属性 和start(),stop() 函数明确运行
}

切换:
需要定义一个Transiton对象,然后将其添加到项目中:

onclicked: rect.state = "moved"

state: State{
name: "moved"
PropertyChanges{target:rect;x:50;y:50}

}
属性 对象
transitions: Transition{
PropertyAnimation{properties: "x,y";duration: 1000}
}

当 Rectangle 改变到 moved 状态时. Transition 将被触发 ,切换的 PropertyAnimation 将会使用动画将 x 和 y 属性改变到它们的新值

所有动画都继承Animation 元素 但是不能直接创建对象,但提供类必要的属性和和函数

easing属性控制属性值使用缓和曲线

原文地址:https://www.cnblogs.com/countryboy666/p/11198250.html

时间: 2024-10-12 16:02:01

Qt_Quick开发实战精解_3的相关文章

Qt_Quick开发实战精解

signal clicked MouseArea { anchors.fill: parent onClicked: { root.clicked() //传递信号给root console.log("MouseArea signal") } //绑定 信号到parent } onClicked: { console.log("Image signal") } 信号调用函数 onClicked: { // reset our little scene circle.

《Cocos2d-x游戏开发实战精解》学习笔记3--在Cocos2d-x中播放声音

<Cocos2d-x游戏开发实战精解>学习笔记1--在Cocos2d中显示图像 <Cocos2d-x游戏开发实战精解>学习笔记2--在Cocos2d-x中显示一行文字 之前的内容主要都是介绍如何在屏幕上显示图像,事实上除了图像之外,音乐的播放也可以被理解为一种显示的方式,本节将学习在Cocos2d-x中播放声音的方法. (1)在HelloWorld.h中对HelloWorld类进行如下定义: class HelloWorld : public Cocos2d::Layer { pu

《Cocos2d-x游戏开发实战精解》学习笔记1--在Cocos2d中显示图像

Cocos2d-x中的图像是通过精灵类来显示的.在Cocos2d-x中游戏中的每一个角色.怪物.道具都可以理解成是一个精灵,游戏背景作为一种特殊的单位将其理解成是一个精灵也没有什么不妥.在源文件本章目录下的项目ChapterThree03就展示了使用Cocos2d-x实现简单游戏开始界面的方法,主要就是通过精灵类来显示图像,其关键代码如范例3-5所示. [范例3-5 在Cocos2d-x中显示图像] Size size = Director::getInstance()->getVisibleS

《Cocos2d-x游戏开发实战精解》学习笔记2--在Cocos2d-x中显示一行文字

在Cocos2d-x中要显示文字就需要用到Label控件.在3.x版本的Cocos2d中,舍弃了之前版本所使用的LabelTTF.LabelAtlas.LabelBMFont 3个用于显示文字的类,而使用一个新类Label取代.可想而知,Label实际上就是对之前3个类进行重新封装并统一渲染. 提示:实际上老版本的内容在3.x版本中依然是可以使用的. 下面是在Cocos2d-x中显示文字的一个例子,具体完整项目可在源文件本章目录下找到项目ChapterThree01查看. [范例3-1 在Coc

《iOS 7 应用开发实战详解》

<iOS 7 应用开发实战详解> 基本信息 作者: 朱元波    管蕾 出版社:人民邮电出版社 ISBN:9787115343697 上架时间:2014-4-25 出版日期:2014 年5月 开本:16开 页码:382 版次:1-1 所属分类:计算机 > 软件与程序设计 > 移动开发 > iPhone 更多关于>>><iOS 7 应用开发实战详解> 编辑推荐 新版本 全面讲解了iOS 7开发的各种技术 热门技术 基本控件.数据存储.多场景处理.界

Node.js继承中的静态类对象(《node.js开发实战详解》书中一些错误的改正)

今天气真好,最近挂掉一些面试之后心情略失落. 神马都是浮云,要永远做好世界第二. 不多提了,你问我心态为啥变好了.-------都是情怀,,. 嗯啊,最近在研究node. 别人问?你这水平还node... 哈哈哈,好伤心.... 不多提了,言归正传. 神马模块化神马的先就不多讲了,就一个module.export和export区别,后者对象的属性属于前者,逆命题不成立. 还有util.inherits(A,B)这个API注意一下A只会继承B的原型方法,原型以外的不会继承.不是说原型中数据是共享的

node.js中socket.io的使用(node.js开发实战详解一个案例分析)

啊,又是这本书.好像里面有个交互图,呃...那个消息响应的顺序好像与我的程序不同. 其实问题也不大,操作实例,控制台运行该文件app.js开启服务: var io=require('socket.io').listen(8080,{log:false}); io.sockets.on('connection',function (socket){ socket.on('msg',function(data){ console.log(data); if(data.state){ if(data.

nodejs开发实战详解

博客 论坛或微博适合吗不适合 PHP在这个方面已经很成熟 解决的是长连接和多请求引发的成本问题 实时在线game 实时在线聊天室  实时消息推送 SNS实时交流 实时监控系统  股票 系统运行状态等 <程序员如何说服老板采用Nodejs> 建立原型 原文地址:https://www.cnblogs.com/yizhixuepython/p/9461925.html

Cocos2d-x游戏开发技术精解读书摘要(2016-5-27 10:52)

 Cocos2d-x游戏开发技术精解 刘剑卓 著 2013年6月第1版 chap2 Cocos2d-x引擎的开发环境 2.1跨平台的开发 2.2建立开发环境 2.2.1 PC开发环境 2.2.2 Android开发环境 2.2.3 iOS开发环境 2.3引擎中的混合编译 2.3.1 Java与C++的混合编译 2.3.2 Objective-C与C++的混合编译 2.4引擎的起点 2.4.1应用程序入口 2.4.2引擎应用入口 2.5丰富的示例程序 2.5.1 TestCpp示例项目 2.5