首页 > 学院 > 开发设计 > 正文

QML 基本元素

2019-11-08 02:04:16
字体:
来源:转载
供稿:网友
1. 介绍QML是一种描述语言,主要是对界面效果等的一种描述,它可以结合javaScript来进行更复杂的效果及逻辑实现。比如做个游戏,实现一些更有趣的功能等2. 简单的例子import Qt 4.7Rectangle { width: 200 height: 200 color: "blue"}代码是绘制一个蓝色的矩形,宽 200 高 200, import包含一个qt4.7的包3.基本元素的介绍(自己翻译意思会有出入,敬请见谅) 基本可视化项Item 基本的项元素 在QML中所有可视化的向都继承他Rectangle 基本的可视化矩形元素Gradient 定义一个两种颜色的渐变过程GradientStop 定义个颜色,被Gradient使用Image 在场景中使用位图BorderImage(特殊的项) 定义一张图片并当做边界AnimatedImage 为播放动画存储一系列的帧Text 在场景中使用文本TextInput 显示可编辑为文本IntValidator int 验证器DoubleValidator double 验证器RegExpValidator 验证字符串正则表达式TextEdit 显示多行可编辑文本基本的交互项MouseArea 鼠标句柄交互FocusScope 键盘焦点句柄Flickable 提供一种浏览整张图片的一部分的效果,具体看例子Flipable 提供一个平面,可以进行翻转看他的前面或后面,具体看例子状态State 定义一个配置对象和属性的集合PRopertyChanges 使用一个State描述属性的改变StateGroup 包含一个状态集合和状态变换ParentChange 重新定义父集,也就是换个父节点AnchorChanges 在一个状态中改变anchors动画和变换Behavior 默认的属性变换动画SequentialAnimation 对定义的动画串行播放ParallelAnimation 对定义的动画并行播放PropertyAnimation 属性变换动画NumberAnimation 对实数类型属性进行的动画Vector3dAnimation 对QVector3d进行的属性ColorAnimation 颜色进行的变换动画RotationAnimation 对旋转进行的变换动画ParentAnimation 对父节点进行变换的动画,改变绑定的父节点AnchorAnimation 对anchor 进行改变的动画PauseAnimation 延迟处理SmoothedAnimation 允许属性平滑的过度SpringAnimation 一种加速的效果PropertyAction 允许在动画过程中对属性的直接改变ScriptAction 允许动画过程中调用脚本Transition 在状态变换中加入动作变化工作中的数据Binding 在创建的时候绑定一些数据到一些属性ListModel 定义链表数据ListElement 定义ListModel的一个数据项VisualItemModel 包含可视化项(visual items)到一个view中,相当是一个容器VisualDataModel 包含一个model和一个delegate,model包含需要的数据,delegate设计显示的项的信息,具体的去看例子Package 他的目的是把VisualDataModel共享给多个view,具体还要学习xmlListModel 特殊的一个模式使用XPath表达式,使用xml来设置元素,参考例子XmlRole XmlListModel的一个特殊的角色试图ListView 提供一个链表显示模型试图GridView 提供一个网格显示模型试图PathView 提供一个内容沿着路径来显示的模型Path 定义一个PathView使用的轨迹PathLine 定义一个线性的轨迹PathQuad 定义一个二次贝塞尔曲线的轨迹PathCubic 定义一个三次贝塞尔曲线的轨迹PathAttribute 允许绑定一个属性上,具体看例子PathPercent 修改item分配的轨迹 不是很明了其中的意思WebView 允许添加网页内容到一个canvas上定位器Column 整理它的子列(纵)Row 整理它的子行(横)Grid 设置它的子到一个网格上Flow 目的是不让他的子项重叠在一起实用Connections 明确连接信号和信号句柄Component 封装QML items 想一个组件一样Timer 提供时间触发器QtObject 基本的元素只包含objectName属性Qt qml全局Qt object提供使用的枚举和函数WorkerScript 允许在QML使用线程Loader 控制载入item或组件Repeater 使用一个模型创建多个组件SystemPalette 为Qt palettes提供一个通道FontLoader 载入字体根据名字或URLLayoutItem 允许声明UI元素插入到qtGraphicsView 布局中变换Scale 分派item 缩放行为Rotation 分派item 旋转行为Translate 分派item 移动行为4.基本元素的使用例子1. Item位置是0,0 宽高分别是200Item { x: 0; y: 0; width: 200; height: 200;}2. Rectangle位置是:0,0宽高分别是200, 颜色是红色Rectangle { x: 0; y: 0; width: 200; height: 200; color: "red"}3. Gradient GradientStop 分别在总高度的0 颜色红色 总高度的1/3 黄色 总高度的1是绿色Rectangle { width: 100; height: 100 gradient: Gradient { GradientStop { position: 0.0; color: "red" } GradientStop { position: 0.33; color: "yellow" } GradientStop { position: 1.0; color: "green" } }}4. Image 设置一张图片Image { source: "../Images/button1.png"}5. BorderImage 他将一张图片分成9部分当图片进行缩放的时候A.1 3 7 9 位置的都不会进行缩放B. 2 8将根据属性horzontalTileMode 进行缩放C.4 6 将根据属性verticalTileMode 进行缩放D.5 将根据属性horzontalTileMode 和 verticalTileMode 进行缩放BorderImage { width: 180; height: 180 // 分割1~9块的4个点是根据border设置的坐标来实现的 // 本别是距离坐标 上边 右边 下边的距离 border { left: 30; top: 30; right: 30; bottom: 30 } horizontalTileMode: BorderImage.Stretch verticalTileMode: BorderImage.Stretch source: "../Images/button1.png"}6. AnimatedImage 主要用于播放gif图片Rectangle { width: animation.width; height: animation.height + 8 AnimatedImage { id: animation; source: "animation.gif" } Rectangle { property int frames: animation.frameCount width: 4; height: 8 x: (animation.width - width) * animation.currentFrame / frames y: animation.height color: "red" }}7. Text 显示文本(具体的其他设置请看文档)Text { text: "text"}8. TextInput 下面是设置一个输入文本框,框中的字符串是Text, 并设置鼠标可以选择文本TextInput{ text: "Text" selectByMouse: true; // 鼠标可以选择}9.IntValidator int 型验证器,和输入框结合后就是只能输入整型数据TextInput{ // 最高可以输入100, 最低输入10 IntValidator{id: intval; bottom: 10; top: 100;} width: 100; height: 20; text: ""; // 使用校验器 validator: intval;}10. DoubleValidator 只能输入浮点数TextInput{ // 最高可以输入100, 最低输入10 decimals最多有多少位小数 // notation 表示是使用科学计数法还是(默认),还是直接的小数 当获取里面的数据 DoubleValidator{id: intval; decimals: 4; bottom: 10; top: 100; notation:DoubleValidator.StandardNotation} width: 100; height: 20; text: ""; // 使用校验器 validator: intval;}11. RegExpValidator 使用正则表达式TextInput{ // 使用一个正则表达式来控制输入的字符串 // /^[a-zA-Z]{1}[0-1]{0,2}[a-z]{1,3}$/ 表示 开始位置必须是一个大写或小写字母 // 接下来是0~2个的数字而且是0或1,在接下来是1~3个的小写字母 RegExpValidator{id: intval; regExp:/^[a-zA-Z]{1}[0-1]{0,2}[a-z]{1,3}$/;} width: 100; height: 20; text: ""; // 使用校验器 validator: intval;}12. TextEdit显示一段hello world的html文本和TextInput相同TextEdit { width: 240 text: "Hello World!" font.family: "Helvetica" font.pointSize: 20 color: "blue" focus: true}13. MouseArea主要是用来判断鼠标事件的区域Rectangle{ x: 0; y: 0; width: 100; height:100; Rectangle{ id: mousrect x: 20; y: 20; width: 20; height: 20; color: "blue" MouseArea{ // 使用父的区域作为鼠标判断的区域及 x: 20; y: 20; width: 20; height: 20; anchors.fill: parent; // 但鼠标按下后 mousrect变成红色,当鼠标松开后变成蓝色 onPressed: { mousrect.color = "red";} onReleased: { mousrect.color = "blue";} } }}14. FocusScope不是很清楚说的什么,好像是说同一个时刻只有一个item有焦点15. Flickable显示一个200x200的框,框中显示图片上200x200的部分Flickable { width: 200; height: 200 // 设置使用图片的宽 高,而现实的是 200x200的现实框 contentWidth: image.width; contentHeight: image.height Image { id: image; source: "../Images/need.png" }}16. Flipable包含两个面,一个前面,一个后面,实现一个控件前后的翻转效果,并且在后面可以添加一些控制Flipable { id: flipable width: 240 height: 240 property int angle: 0 property bool flipped: false front: Image { source: "front.png" } // 前面 back: Image { source: "back.png" } // 后面 // 旋转动画 前后面交换 transform: Rotation { origin.x: flipable.width/2; origin.y: flipable.height/2 axis.x: 0; axis.y: 1; axis.z: 0 // rotate around y-axis angle: flipable.angle } states: State { name: "back" PropertyChanges { target: flipable; angle: 180 } when: flipable.flipped } transitions: Transition { NumberAnimation { properties: "angle"; duration: 1000 } } MouseArea { anchors.fill: parent onClicked: flipable.flipped = !flipable.flipped }}17. State// 当鼠标按下后改变 myRect 的颜色Rectangle { id: myRect width: 100; height: 100 color: "black" MouseArea { id: mouseArea anchors.fill: parent onClicked: myRect.state == 'clicked' ? myRect.state = "" : myRect.state = 'clicked'; } // 设置状态 states: [ State { name: "clicked" PropertyChanges { target: myRect; color: "red" } } ]}18. PropertyChanges// 当鼠标按下后改变状态// 状态里面的属性改变包含了文本和颜色的改变Text { id: myText width: 100; height: 100 text: "Hello" color: "blue" states: State { name: "myState" // 当这个状态被设置的时候,将改变myText的文本和颜色 PropertyChanges { target: myText text: "Goodbye" color: "red" } } MouseArea { anchors.fill: parent; onClicked: myText.state = 'myState' }}19. StateGroup一个状态组中可以包含很多的状态和变化,而状态也可以和变换绑定.20. StateChangeScript在状态中可以对脚本中的函数进行调用// Sc.jsfunction changeColor() // 返回蓝色{ return "blue";}// test.qmlimport "Sc.js" as CodeRectangle{ id: rect width: 50; height: 50 color: "red" MouseArea { anchors.fill: parent onClicked: rect.state = "first" // 鼠标按下改变状态 } states: State {name: "first"; StateChangeScript{ name: "myScript"; script: rect.color = Code.changeColor(); } }}21. ParentChang把指定的item换一个item父节点Item { width: 200; height: 100 Rectangle { id: redRect width: 100; height: 100 color: "red" } // 本来blueRect的父节点是Item 当鼠标按下后他被设置到 redRect上 Rectangle { id: blueRect x: redRect.width width: 50; height: 50 color: "blue" states: State { name: "reparented" // 改变父节点 ParentChange { target: blueRect; parent: redRect; x: 10; y: 10 } } MouseArea { anchors.fill: parent; onClicked: blueRect.state = "reparented" } }}22. AnchorChangesRectangle { id: window width: 120; height: 120 color: "black" Rectangle { id: myRect; width: 50; height: 50; color: "red" } states: State { name: "reanchored" AnchorChanges { // 改变 myRect 的anchors属性 target: myRect anchors.top: window.top anchors.bottom: window.bottom } PropertyChanges { target: myRect anchors.topMargin: 10 anchors.bottomMargin: 10 } } // 鼠标事件 MouseArea { anchors.fill: parent; onClicked: window.state = "reanchored" }}23. BehaviorRectangle { id: rect width: 100; height: 100 color: "red" // 针对宽度的动画 Behavior on width { NumberAnimation { duration: 1000 } } MouseArea { anchors.fill: parent onClicked: rect.width = 50 }}24. SequentialAnimation串行播放多个动画Rectangle { id: rect1 width: 500; height: 500 Rectangle{ id: rect; color: "red" width: 100; height: 100 // 串行播放多个动画,先横向移动,在纵向移动 SequentialAnimation{ running: true; NumberAnimation {target:rect; properties:"x"; to: 50; duration: 1000 } NumberAnimation {target:rect; properties:"y"; to: 50; duration: 1000 } } }}25. ParallelAnimationRectangle { id: rect1 width: 500; height: 500 Rectangle{ id: rect; color: "red" width: 100; height: 100 // 并行播放动画,同时横向和纵向移动 ParallelAnimation{ running: true; NumberAnimation {target:rect; properties:"x"; to: 50; duration: 1000 } NumberAnimation {target:rect; properties:"y"; to: 50; duration: 1000 } } }}26. PropertyAnimationRectangle { id: rect width: 100; height: 100 color: "red" states: State { name: "moved" PropertyChanges { target: rect; x: 50 } } transitions: Transition { // 属性动画 这里是当属性 x或y发生变化的时候,就播放这样一个动画 PropertyAnimation { properties: "x,y"; easing.type: Easing.InOutQuad } } MouseArea{ anchors.fill: parent; onClicked: rect.state = "moved"; }}27. NumberAnimationRectangle { width: 100; height: 100 color: "red" // 对当前item的x进行移动,目标移动到x = 50 NumberAnimation on x { to: 50; duration: 1000 }}28. Vector3dAnimation29. ColorAnimation颜色的过度Rectangle { width: 100; height: 100 color: "red" ColorAnimation on color { to: "yellow"; duration: 1000 }}30. RotationAnimation默认是绕z轴进行的旋转Item { width: 300; height: 300 Rectangle { id: rect width: 150; height: 100; anchors.centerIn: parent color: "red" smooth: true states: State { name: "rotated"; PropertyChanges { target: rect; rotation: 180 } } transitions: Transition { RotationAnimation { duration: 1000; direction: RotationAnimation.Counterclockwise } } } MouseArea { anchors.fill: parent; onClicked: rect.state = "rotated" }}31. ParentAnimation一个切换父节点的动画,平滑的过度Item { width: 200; height: 100 Rectangle { id: redRect width: 100; height: 100 color: "red" } Rectangle { id: blueRect x: redRect.width width: 50; height: 50 color: "blue" states: State { name: "reparented" ParentChange { target: blueRect; parent: redRect; x: 10; y: 10 } } transitions: Transition { ParentAnimation { NumberAnimation { properties: "x,y"; duration: 1000 } } } MouseArea { anchors.fill: parent; onClicked: blueRect.state = "reparented" } }}32. AnchorAnimationItem { id: container width: 200; height: 200 Rectangle { id: myRect width: 100; height: 100 color: "red" } states: State { name: "reanchored" AnchorChanges { target: myRect; anchors.right: container.right } } transitions: Transition { // smoothly reanchor myRect and move into new position AnchorAnimation { duration: 1000 } } // 当控件加载完成后 Component.onCompleted: container.state = "reanchored"}33. PauseAnimation延迟效果Item { id: container width: 200; height: 200 Rectangle { id: myRect width: 100; height: 100 color: "red" SequentialAnimation { running: true; NumberAnimation {target: myRect;to: 50; duration: 1000; properties: "x"; } PauseAnimation { duration: 5000 } // 延迟100毫秒 NumberAnimation {target: myRect; to: 50; duration: 1000; properties: "y"; } } }}34. SmoothedAnimation平滑过度Rectangle { width: 800; height: 600 color: "blue" Rectangle { width: 60; height: 60 x: rect1.x - 5; y: rect1.y - 5 color: "green" Behavior on x { SmoothedAnimation { velocity: 200 } } Behavior on y { SmoothedAnimation { velocity: 200 } } } Rectangle { id: rect1 width: 50; height: 50 color: "red" } focus: true Keys.onRightPressed: rect1.x = rect1.x + 100 Keys.onLeftPressed: rect1.x = rect1.x - 100 Keys.onUpPressed: rect1.y = rect1.y - 100 Keys.onDownPressed: rect1.y = rect1.y + 100}35. SpringAnimation平滑的过度过程,在动画结束的时候有种弹性的效果Item { width: 300; height: 300 Rectangle { id: rect width: 50; height: 50 color: "red" Behavior on x { SpringAnimation { spring: 2; damping: 0.2 } } Behavior on y { SpringAnimation { spring: 2; damping: 0.2 } } } MouseArea { anchors.fill: parent onClicked: { rect.x = mouse.x - rect.width/2 rect.y = mouse.y - rect.height/2 } }}36. PropertyAction主要是在动画过程中直接的改变一个属性transitions: Transition { ... PropertyAction { target: theImage; property: "smooth"; value: true } ...}38. ScriptAction在动画过程中嵌入脚本的调用SequentialAnimation { NumberAnimation { ... } ScriptAction { script: doSomething(); } NumberAnimation { ... }}39. TransitionRectangle { id: rect width: 100; height: 100 color: "red" MouseArea { id: mouseArea anchors.fill: parent } states: State { name: "moved"; when: mouseArea.pressed PropertyChanges { target: rect; x: 50; y: 50 } } transitions: Transition { NumberAnimation { properties: "x,y"; easing.type: Easing.InOutQuad } }}40. BindingItem { width: 300; height: 300 Text {id: app; text: "xxxfa"} TextEdit { id: myTextField; text: "Please type here..." } // 把myTextField和app的enteredText属性进行绑定 Binding { target: app; property: "enteredText"; value: myTextField.text }}41. ListModel直接看效果Rectangle { width: 200; height: 200 ListModel { id: fruitModel ListElement { name: "Apple" cost: 2.45 } ListElement { name: "Orange" cost: 3.25 } ListElement { name: "Banana" cost: 1.95 } } Component { id: fruitDelegate Row { spacing: 10 Text { text: name } Text { text: '$' + cost } } } ListView { anchors.fill: parent model: fruitModel delegate: fruitDelegate }}42. ListElement请参照ListModel43. VisualItemModel把可视化图元添加到链表试图Rectangle { width: 100; height: 100; VisualItemModel { id: itemModel Rectangle { height: 30; width: 80; color: "red" } Rectangle { height: 30; width: 80; color: "green" } Rectangle { height: 30; width: 80; color: "blue" } } ListView { anchors.fill: parent model: itemModel }}44. VisualDataModel看下面效果Rectangle { width: 200; height: 100 VisualDataModel { id: visualModel model: ListModel { ListElement { name: "Apple" } ListElement { name: "Orange" } } delegate: Rectangle { height: 25 width: 100 Text { text: "Name: " + name} } } ListView { anchors.fill: parent model: visualModel }}45. Package具体请参考declarative/modelviews/package46. XmlListModel XmlRole从网络获取xml,暂时没有测试成功47. ListView参考 ListModel VisualDataModel48. GridView看效果Rectangle { width: 200; height: 400; ListModel { id: fruitModel ListElement { name: "Apple" cost: 2.45 } ListElement { name: "Orange" cost: 3.25 } ListElement { name: "Banana" cost: 1.95 } } GridView { anchors.fill: parent model: fruitModel delegate: Column{ Text {text:"name" + name} Text {text:"cost"+ cost} } }}49.PathView Path看例子Rectangle { width: 200; height: 400; ListModel { id: fruitModel ListElement { name: "Apple" cost: 2.45 } ListElement { name: "Orange" cost: 3.25 } ListElement { name: "Banana" cost: 1.95 } } PathView { anchors.fill: parent model: fruitModel delegate: Column{ Text {text:"name" + name} Text {text:"cost"+ cost} } path:Path{ startX: 120; startY: 100 PathQuad { x: 120; y: 25; controlX: 260; controlY: 75 } PathQuad { x: 120; y: 100; controlX: -20; controlY: 75 } } }}50.PathLine具体的看运行的例子Rectangle { width: 200; height: 400; ListModel { id: fruitModel ListElement { name: "Apple" cost: 2.45 } ListElement { name: "Orange" cost: 3.25 } ListElement { name: "Banana" cost: 1.95 } } PathView { anchors.fill: parent model: fruitModel delegate: Column{ Text {text:"name" + name} Text {text:"cost"+ cost} } path:Path{ startX: 150; startY: 120 PathLine { x: 200; y: 80; } PathLine { x: 100; y: 80; } PathLine { x: 150; y: 120; } } }}51.PathQuad参考 PathView Path52.PathCubic还要看53.PathAttribute可以直接针对一些属性进行改变Rectangle { width: 200; height: 400; ListModel { id: fruitModel ListElement { name: "Apple" cost: 2.45 } ListElement { name: "Orange" cost: 3.25 } ListElement { name: "Banana" cost: 1.95 } } PathView { anchors.fill: parent model: fruitModel delegate: Item { id: delitem; width: 80; height: 80; Column{ // 这里使用图片试试 Rectangle { width: 40; height: 40; scale: delitem.scale; color: "red" } Text {text:"name" + name} Text {text:"cost"+ cost} } } // path: Path { startX: 120; startY: 100 PathAttribute { name: "Scale"; value: 1.0 } PathQuad { x: 120; y: 25; controlX: 260; controlY: 75 } PathAttribute { name: "Scale"; value: 0.3 } PathQuad { x: 120; y: 100; controlX: -20; controlY: 75 } } }}54.PathPercent具体请看QML文档55.WebViewimport QtWebKit 1.0WebView { url: "http://www.nokia.com" preferredWidth: 490 preferredHeight: 400 scale: 0.5 smooth: false}56 Column横向排列Rectangle{ width: 100; height: 100; // 纵向排列 Column { spacing: 2 Rectangle { color: "red"; width: 50; height: 50 } Rectangle { color: "green"; width: 20; height: 50 } Rectangle { color: "blue"; width: 50; height: 20 } }}57 RowRectangle{ width: 100; height: 100; // 横向排列 Row { spacing: 2 Rectangle { color: "red"; width: 50; height: 50 } Rectangle { color: "green"; width: 20; height: 50 } Rectangle { color: "blue"; width: 50; height: 20 } }}58 GridRectangle{ width: 100; height: 100; // 网格排列 Grid { columns: 3 spacing: 2 Rectangle { color: "red"; width: 50; height: 50 } Rectangle { color: "green"; width: 20; height: 50 } Rectangle { color: "blue"; width: 50; height: 20 } Rectangle { color: "cyan"; width: 50; height: 50 } Rectangle { color: "magenta"; width: 10; height: 10 } }}59 FlowRectangle{ width: 100; height: 100; // 网格排列 Flow { spacing: 2 width: 100; height: 100; Rectangle { color: "red"; width: 50; height: 50 } Rectangle { color: "green"; width: 20; height: 50 } Rectangle { color: "blue"; width: 50; height: 20 } Rectangle { color: "cyan"; width: 50; height: 50 } Rectangle { color: "magenta"; width: 10; height: 10 } }}60 Connections下面是3中情况下会使用的,具体的不好翻译Multiple connections to the same signal are required有多个连接要连接到相同的信号时Creating connections outside the scope of the signal sender创建的连接在范围之外Connecting to targets not defined in QML创建的连接没有在QML中定义的Rectangle{ width: 100; height: 100; MouseArea { id: area anchors.fill: parent; } Connections { target: area onClicked: { console.log(" ok");} }}61 Component组件是可以重用的QML元素,具体还是看QML的文档翻译不是很好Item { width: 100; height: 100 // 定义一个组件他包含一个10x10的红色矩形 Component { id: redSquare Rectangle { color: "red" width: 10 height: 10 } } // 动态的载入一个组件 Loader { sourceComponent: redSquare } Loader { sourceComponent: redSquare; x: 20 }}62 TimerItem { width: 200; height: 40; // 和QTimer 差不多 Timer { interval: 500; running: true; repeat: true onTriggered: time.text = Date().toString() // 使用Javascript获取系统时间 } Text { id: time }}63 QtObject他是不可见的只有objectName一个属性通过这个属性我们可以在c++中找到我们想要的对象// MyRect.qmlimport Qt 4.7Item { width: 200; height: 200 Rectangle { anchors.fill: parent color: "red" objectName: "myRect" }}// main.cppQDeclarativeView view;view.setSource(QUrl::fromLocalFile("MyRect.qml"));view.show();QDeclarativeItem *item = view.rootObject()->findChild<QDeclarativeItem*>("myRect");if (item) item->setProperty("color", QColor(Qt::yellow));64 Qt提供全局有用的函数和枚举,具体的看QML文档65. WorkerScript使用它可以把操作放到一个新的线程中,使得它在后台运行而不影响主GUI具体可以看QML中它的文档66. Loader可以参考Component还有QML中的文档67 Repeater他可以创建很多相似的组件,QML中还有几个例子Row { Repeater { model: 3 Rectangle { width: 100; height: 40 border.width: 1 color: "yellow" } }}68 SystemPalette具体看效果和文档Rectangle { SystemPalette { id: myPalette; colorGroup: SystemPalette.Active } width: 640; height: 480 color: myPalette.window Text { anchors.fill: parent text: "Hello!"; color: myPalette.windowText }}69. FontLoader载入一种字体,可以是网络上的,也可以是本地的Column { FontLoader { id: fixedFont; name: "Courier" } FontLoader { id: webFont; source: "http://www.mysite.com/myfont.ttf" } Text { text: "Fixed-size font"; font.family: fixedFont.name } Text { text: "Fancy font"; font.family: webFont.name }}70 LayoutItem不清楚71 Scale对缩放的控制Rectangle { width: 100; height: 100 color: "blue" Rectangle{ x: 50; y: 50; width: 20; height: 20; color: "red" // 这里是在当前矩形的中间位置沿x轴进行3倍缩放 transform: Scale { origin.x: 10; origin.y: 10; xScale: 3} }}72 RotationRectangle { width: 100; height: 100 color: "blue" // 绕位置25,25 旋转45度 transform: Rotation { origin.x: 25; origin.y: 25; angle: 45}}73 TranslateRow { Rectangle { width: 100; height: 100 color: "blue" // 沿y轴正方向移动20个像素 transform: Translate { y: 20 } } Rectangle { width: 100; height: 100 color: "red" // 沿y轴负方向移动20个像素 transform: Translate { y: -20 } }}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表