转换操作改变了一个对象的几何状态。QML元素对象通常能够被平移,旋转,缩放。下面我们将讲解这些简单的操作和一些更高级的用法。 我们先从一个简单的转换开始。用下面的场景作为我们学习的开始。

    • 简单的位移是通过改变x,y坐标来完成的。
    • 旋转是改变rotation(旋转)属性来完成的,这个值使用角度作为单位(0~360)。
    • 缩放是通过改变scale(比例)的属性来完成的,小于1意味着缩小,大于1意味着放大。

    旋转与缩放不会改变对象的几何形状,对象的x,y(坐标)与width/height(宽/高)也类似。只有绘制指令是被转换的对象。

    在我们展示例子之前我想要介绍一些东西:ClickableImage元素(ClickableImage element),ClickableImage仅仅是一个包含鼠标区域的图像元素。我们遵循一个简单的原则,三次使用相同的代码描述一个用户界面最好可以抽象为一个组件。

    代码

    1. // ClickableImage.qml
    2. import QtQuick 2.15
    3. // 抽象出来的组件
    4. Image {
    5. id:root
    6. signal clicked
    7. MouseArea {
    8. anchors.fill: parent
    9. onClicked: root.clicked()
    10. }
    11. }
    1. // transformation.qml
    2. import QtQuick 2.15
    3. import QtQuick.Window 2.15
    4. Rectangle {
    5. width: 350
    6. height: 400
    7. // widget的点击事件
    8. MouseArea {
    9. id: backgroundClicker
    10. // 由于顺序的关系,需要在图像之前,否则这个鼠标区域将在其他元素之前并使用鼠标事件
    11. anchors.fill: parent
    12. onClicked: {
    13. // reset our little scene
    14. rocket1.x = 20
    15. rocket2.rotation = 0
    16. rocket3.rotation = 0
    17. rocket3.scale = 1.0
    18. }
    19. }
    20. // rocket1点击时右移
    21. ClickableImage {
    22. id: rocket1
    23. x: 20; y: 100
    24. source: "assets/rocket.png"
    25. onClicked: {
    26. x += 5
    27. }
    28. }
    29. // rocket2点击时旋转
    30. ClickableImage {
    31. id: rocket2
    32. x: 140; y: 100
    33. source: "assets/rocket.png"
    34. smooth: true // 增加反锯齿
    35. onClicked: {
    36. rotation += 5
    37. }
    38. }
    39. // rocket3点击时会缩小
    40. ClickableImage {
    41. id: rocket3
    42. x: 240; y: 100
    43. source: "assets/rocket.png"
    44. smooth: true // 增加反锯齿
    45. onClicked: {
    46. rotation += 5
    47. scale -= 0.05
    48. }
    49. }
    50. }

    效果:
    GC{23C$EB2RLNZ{2@RMM42X.png![]E(UC5@4YPED3_W8OWX0VJ.png

    注意:

    1. 为了获得更好的显示效果,当缩放图片时推荐使用已缩放的图片来替代,过量的放大可能会导致图片模糊不清。当你在缩放图片时你最好考虑使用smooth: true来提高图片显示质量。
    2. 在代码中先出现的元素有更低的堆叠顺序(叫做z顺序值z-order),如果你点击火箭1足够多次,你会看见火箭1移动到了火箭2下面。z轴顺序也可以使用元素对象的z-property来控制。

    由于火箭2后出现在代码中,火箭2将会放在火箭1上面。这同样适用于MouseArea(鼠标区域),一个后出现在代码中的鼠标区域将会与之前的鼠标区域重叠,后出现的鼠标区域才能捕捉到鼠标事件。

    1. 请记住:文档中元素的顺序很重要。