C

Qt Quick Ultralite 绘制项目示例

演示了在 Qt Quick Ultralite 应用程序中使用 PaintedItem

概述

painteditem 示例使用 PaintedItem Qml 类型直接在帧缓冲区上绘图。它显示了一个动画,模拟在曲线斜坡上圆形滴状物体的振荡运动。

该示例使用 OscillatorPaintedItem 类,它覆盖了 paint() 方法来绘制曲线斜坡和圆形滴状物体。每当角度属性更新时(每 100ms 更新一次),都会调用 paint() 方法。

目标平台

项目结构

painteditem 示例包含以下文件

  • CMakeLists.txt
  • mcu_painteditem.qmlproject
  • oscillator.qml
  • main_baremetal.cpp
  • oscPaintedItem.cpp
  • oscPaintedItem.h

CMake 项目文件包含一个基本的构建脚本,oscillator.qml 定义了应用程序的 UI,而项目配置定义在 mcu_painteditem.qmlproject 中。

main_baremetal.cpp 包含设置裸机平台应用程序的 main 函数。

oscPaintedItem.hoscPaintedItem.cpp 文件包含 OscillatorPaintedItem 类的定义,该类从 PaintedItemDelegate 类派生。

CMake 项目文件
cmake_minimum_required (VERSION 3.21.1)

project(painteditem VERSION 0.0.1 LANGUAGES C CXX ASM)
if (NOT TARGET Qul::Core)
    find_package(Qul)
endif()

string(TOLOWER ${QUL_PLATFORM} PLATFORM_LOWERCASE)

set (GENERATE_ENTRYPOINT_ARG "")
if (QUL_OS STREQUAL "FreeRTOS")
    set(GENERATE_ENTRYPOINT_ARG GENERATE_ENTRYPOINT)
endif()

qul_add_target(painteditem QML_PROJECT mcu_painteditem.qmlproject oscPaintedItem.cpp ${GENERATE_ENTRYPOINT_ARG})

if (PLATFORM_LOWERCASE MATCHES "^rh850" OR PLATFORM_LOWERCASE MATCHES "^tvii")
    target_compile_definitions(painteditem PRIVATE NO_TOUCH)
endif()

app_target_setup_os(painteditem)

if (NOT QUL_OS STREQUAL "FreeRTOS")
    target_sources(painteditem PRIVATE
                   main_baremetal.cpp
    )
endif()
QmlProject 文件
import QmlProject 1.3

Project {
        mainFile: "oscillator.qml"

        InterfaceFiles {
                files: [
                        "oscPaintedItem.h"
                ]
        }

        ModuleFiles {
                MCU.qulModules: ["Controls"]
        }
}
PaintedItem

PaintedItem Qml 类型的 delegate_ 属性指向 OscillatorPaintedItem 实例。

                    //PaintedItem Object
                    PaintedItem {
                        id: oscillator
                        anchors.right: parent.right
                        anchors.top: parent.top
                        anchors.fill: parent

                        delegate_: OscillatorPaintedItem {
                            id: delegate
                            angle: 0.0
                            initialAngle: 50
                            pivotLength: 50

                            onAngleChanged: {
                                delegate.update()
                            }
                        }
                    }
文本项

显示初始角度和固定阻尼系数的振荡在左上角。

                    Text {
                        anchors.top: parent.top
                        anchors.topMargin: 8
                        anchors.left: parent.left
                        anchors.leftMargin: 8
                        text: "Angle: " + delegate.initialAngle + "\ndamping: " + app.dampingFactor
                        font.pixelSize: 13
                    }
重播按钮

当振荡角度达到 0 时,圆形滴状物体处于静止状态。按下 重播 按钮,通过将初始角度设置回最大值来重新启动动画。

                    Button {
                        id: replay

                        //For platforms not supporting touch input, hide Replay button.
                        visible: !root.automaticAnimation

                        anchors.horizontalCenter: parent.horizontalCenter
                        anchors.bottom: parent.verticalCenter
                        height: 40
                        width: 70
                        font.pixelSize: 13
                        text: "Replay"

                        background: Rectangle {
                            color: replay.down ? "#A39D9C" : "#B8B3B2"
                            radius: 8
                        }

                        onClicked: {
                          /*Setting the initialAngle property to maximum value disturbs the equilibrium and
                          triggers the animation again.*/
                          delegate.initialAngle = 50
                        }
动画计时器

动画关注角度属性,该属性每 100ms 更新一次。每次对角度属性的更新都会触发代理更新,从而调用 OscillatorPaintedItem 的 paint() 方法。

                    Timer {
                        running: root.automaticAnimation
                        repeat: true
                        interval: 8000
                        onTriggered: delegate.initialAngle = 50
                    }

文件

在某些Qt许可证下可用。
了解更多。