QT QML 练习1

这个代码是使用 QtQuick 框架编写的一个简单的 GUI 应用程序,创建了一个窗口,其中包含了一个背景图像、一个风车杆(pole),以及一个可以点击旋转的风车(pinwheel)。以下是对实现的详细介绍及其特点:

代码结构及实现细节

  1. 导入 QtQuick

    qml 复制代码
    import QtQuick

    这个导入语句引入了 QtQuick 模块,它是创建现代、动画丰富的用户界面的核心模块。

  2. 创建窗口 (Window)

    qml 复制代码
    Window {
        width: 500
        height: 300
        visible: true
        title: qsTr("小风车转转呀转")
    • 创建了一个宽 500 像素,高 300 像素的窗口。
    • 设置 visible: true 使窗口可见。
    • 设置 title"小风车转转呀转",这会在窗口顶部显示。
  3. 背景图片 (background)

    qml 复制代码
    Image {
        anchors.fill: parent
        id: background
        source: "./background.png"
    • 创建一个 Image 元素,用于显示背景图。
    • 使用 anchors.fill: parent 使背景图片填充整个窗口。
    • 设置 source: "./background.png",从当前目录加载背景图。
  4. 风车杆 (pole)

    qml 复制代码
    Image {
        id: pole
        source: "./pole.png"
        width: background.width * 0.02
        height: background.height * 0.6
        anchors.bottom: parent.bottom
        anchors.horizontalCenter: parent.horizontalCenter
    • 创建了一个 Image 元素用于表示风车杆。
    • 设置了 source 属性从文件加载风车杆的图像。
    • widthheight 使用背景的尺寸进行百分比设置,以适应窗口的变化,保持比例一致。
    • 使用 anchors.bottom: parent.bottom 使风车杆底部与背景的底部对齐。
    • anchors.horizontalCenter: parent.horizontalCenter 确保风车杆水平居中。
  5. 风车 (pinwheel)

    qml 复制代码
    Image {
        id: pinwheel
        source: "./pinwheel.png"
        width: background.width * 0.16
        height: width
        anchors.bottom: pole.top
        anchors.horizontalCenter: pole.horizontalCenter
        rotation: 20
    
        Behavior on rotation {
            NumberAnimation {
                duration: 500
            }
        }
    }
    • 创建了另一个 Image 元素用于显示风车。
    • 设置了 source"./pinwheel.png",加载风车图片。
    • width 设置为 background.width * 0.16,这使风车的宽度随着背景变化保持比例。
    • height 设置为和 width 相同,以确保风车为正方形。
    • 使用 anchors.bottom: pole.top 使风车的位置位于风车杆的顶部,水平居中对齐风车杆。
    • 设置初始旋转角度为 20,通过 rotation: 20
    • 使用 Behavior on rotation,定义了一个 NumberAnimation,动画持续时间为 500 毫秒,保证旋转角度变化时有平滑过渡效果。
  6. 点击旋转控制 (MouseArea)

    qml 复制代码
    MouseArea {
        anchors.fill: parent
        onClicked: pinwheel.rotation += 360
    }
    • MouseArea 用于响应鼠标点击事件,anchors.fill: parent 表示 MouseArea 填充整个窗口。
    • 当点击窗口时,会执行 onClicked 中的代码,将 pinwheel.rotation 增加 360 度,使风车旋转一圈。
    • 每次点击风车都会增加 rotation 值,因此风车看起来会顺时针旋转。

代码的特点

  1. 组件结构清晰

    • 窗口(Window)中包含背景(background)、风车杆(pole)和风车(pinwheel)等元素,结构清晰,便于理解和维护。
  2. 动画效果

    • 使用了 NumberAnimation 对风车的旋转进行平滑处理,使得风车旋转起来更加自然,不会突然改变角度。
  3. 响应用户交互

    • MouseArea 提供了用户交互,点击可以让风车旋转,实现了简单的用户交互功能。
  4. 相对布局

    • 使用相对布局,风车和风车杆的位置相对于背景进行调整,这样即使改变窗口大小,风车和风车杆的相对位置也能保持一致。
  5. 尺寸动态调整

    • 使用 background.widthbackground.height 的比例来设置风车杆和风车的尺寸,确保窗口大小变化时整体布局和比例保持不变。

可改进的地方

  1. 持续旋转

    • 目前点击一次只能让风车旋转一圈,可能需要通过状态控制和无限循环动画来实现持续旋转的效果。
  2. 点击控制开始和停止

    • 可以改进为点击一次启动旋转,再次点击则停止旋转,实现更灵活的用户交互。
  3. 尺寸和布局的改进

    • 可以考虑使用更精细的布局方式,进一步确保在不同窗口尺寸下的稳定性和美观性,比如使用 Layout 模块进行更细致的布局控制。

总体来说,这段代码实现了一个基本的可交互的动画界面,具有相对简单的动画和交互功能,是学习 QML 及其动画、布局和用户交互特性的良好起点。

功能:点击鼠标,风车旋转360度

c 复制代码
import QtQuick

Window {
    width: 500 /* background.width */
    height: 300 /* background.height */
    visible: true
    title: qsTr("小风车转转呀转")

    Image {
        anchors.fill: parent
        id: background
        source: "./background.png" // URL

        Image {
            id: pole
            source: "./pole.png"
            width: background.width * 0.02 // 使用背景的宽度的百分比来设置杆子的宽度
            height: background.height * 0.6 // 使用背景的高度的百分比来设置杆子的高度
            anchors.bottom: parent.bottom
            anchors.horizontalCenter: parent.horizontalCenter
        }

        Image {
            id: pinwheel
            source: "./pinwheel.png"
            width: background.width * 0.16 // 使用背景的宽度的百分比来设置风车的宽度
            height: width // 确保风车保持正方形
            anchors.bottom: pole.top
            anchors.horizontalCenter: pole.horizontalCenter
            rotation: 20

            Behavior on rotation {
                NumberAnimation {
                    duration: 500
                }
            }
        }

        MouseArea {
            anchors.fill: parent
            onClicked: pinwheel.rotation += 360
        }
    }
}
相关推荐
Run Out Of Brain5 分钟前
升级MySQL
数据库·mysql
白露与泡影30 分钟前
Redis 性能优化 18招
数据库·redis·性能优化
Run Out Of Brain32 分钟前
MySQL教程之:输入查询
数据库·mysql
边城仔33 分钟前
【MySQL数据库】基础总结
数据库·mysql·数据库基础
itclanCoder35 分钟前
针对服务器磁盘爆满,MySql数据库始终无法启动,怎么解决
运维·服务器·数据库·mysql·adb
落霞的思绪36 分钟前
苍穹外卖07——来单提醒和客户催单(涉及SpringTask、WebSocket协议、苍穹外卖跳过微信支付同时保证可以收到订单功能)
linux·前端·数据库
qw94939 分钟前
MySQL 16 章——变量、流程控制和游标
数据库·mysql
黑牛先生42 分钟前
【Linux】模拟Shell命令行解释器
linux·运维·服务器
DDDDDBBBBBBBAAAAA1 小时前
ORACLE-执行计划查询
java·数据库·sql·oracle
bai_shuang1 小时前
Linux环境(Ubuntu)上搭建MQTT服务器(EMQX )网络环境部署
linux·服务器·ubuntu