QML官方Demo学习之Scene Graph - Painted Item

在Qt帮助文档中搜索“Scene Graph - Painted Item ”可以看到,原来的代码是写成QML调用C++插件的方式。由于插件方式对不熟悉的同学来说,可能要踩一些坑,其实可以放在一个工程里,通过qmlRegisterType的方式进行注册,然后在qml中进行调用。

QQuickPaintedItem继承自QQuickItem,而QQuickItem就是Qml中的Item。
QQuickPaintedItem通过重载paint函数,就可以使用QPainter绘制。
自定义的QQuickPaintedItem子类需要注册到Qml中才能使用,注册类型或者注册实例都可以。

textballoon.h

#ifndef TEXTBALLOON_H
#define TEXTBALLOON_H

#include <QtQuick>

class TextBalloon : public QQuickPaintedItem
{
    Q_OBJECT
    Q_PROPERTY(bool rightAligned READ isRightAligned WRITE setRightAligned NOTIFY rightAlignedChanged)

    public:
        TextBalloon(QQuickItem *parent = nullptr);
        void paint(QPainter *painter);

        bool isRightAligned();
        void setRightAligned(bool rightAligned);

    private:
        bool rightAligned;

    signals:
        void rightAlignedChanged();
};

#endif

textballoon.cpp

#include "textballoon.h"

TextBalloon::TextBalloon(QQuickItem *parent)
    : QQuickPaintedItem(parent)
    , rightAligned(false)
{
}

void TextBalloon::paint(QPainter *painter)
{
    QBrush brush(QColor("#007430"));

    painter->setBrush(brush);
    painter->setPen(Qt::NoPen);
    painter->setRenderHint(QPainter::Antialiasing);

    QSizeF itemSize = size();
    painter->drawRoundedRect(0, 0, static_cast<int>(itemSize.width()), static_cast<int>(itemSize.height() - 10), 10, 10);

    if (rightAligned)
    {
        const QPointF points[3] = {
            QPointF(itemSize.width() - 10.0, itemSize.height() - 10.0),
            QPointF(itemSize.width() - 20.0, itemSize.height()),
            QPointF(itemSize.width() - 30.0, itemSize.height() - 10.0),
        };
        painter->drawConvexPolygon(points, 3);
    }
    else
    {
        const QPointF points[3] = {
            QPointF(10.0, itemSize.height() - 10.0),
            QPointF(20.0, itemSize.height()),
            QPointF(30.0, itemSize.height() - 10.0),
        };
        painter->drawConvexPolygon(points, 3);
    }
}

bool TextBalloon::isRightAligned()
{
    return this->rightAligned;
}

void TextBalloon::setRightAligned(bool rightAligned)
{
    this->rightAligned = rightAligned;
}

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlEngine>
#include "textballoon.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;

    qmlRegisterType<TextBalloon>("TextBalloonPlugin", 1, 0, "TextBalloon");
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

main.qml

import QtQuick 2.9
import QtQuick.Window 2.2
import TextBalloonPlugin 1.0

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    //! [0]
    ListModel {
        id: balloonModel
        ListElement {
            balloonWidth: 200
        }
        ListElement {
            balloonWidth: 120
        }
    }

    ListView {
        anchors.bottom: controls.top
        anchors.bottomMargin: 2
        anchors.top: parent.top
        id: balloonView
        delegate: TextBalloon {
            anchors.right: index % 2 == 0 ? undefined : parent.right
            height: 60
            rightAligned: index % 2 == 0 ? false : true
            width: balloonWidth
        }
        model: balloonModel
        spacing: 5
        width: parent.width
    }

    Rectangle {
        id: controls

        anchors.bottom: parent.bottom
        anchors.left: parent.left
        anchors.margins: 1
        anchors.right: parent.right
        border.width: 2
        color: "white"
        height: parent.height * 0.15

        Text {
            anchors.centerIn: parent
            text: "Add another balloon"
        }

        MouseArea {
            anchors.fill: parent
            hoverEnabled: true
            onClicked: {
                balloonModel.append({"balloonWidth": Math.floor(Math.random() * 200 + 100)})
                balloonView.positionViewAtIndex(balloonView.count -1, ListView.End)
            }
            onEntered: {
                parent.color = "#8ac953"
            }
            onExited: {
                parent.color = "white"
            }
        }
    }
}

运行效果:
在这里插入图片描述

代码地址:https://github.com/xiaozia/blogs/tree/master/qml/20190729/TextBalloonDemo

参考:
Qt Quick实现的涂鸦程序 https://blog.csdn.net/u010002704/article/details/41514371

Qml组件化编程7-自绘组件 https://blog.csdn.net/d759378563/article/details/90384469

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt QML仪表Demo是一个用于展示仪表效果的示例程序,通过使用Qt框架中的QML语言进行开发。QML是一种用于构建用户界面的声明式语言,它可以与C++代码无缝交互,并且可以跨平台运行。 这个仪表Demo通常包含一个圆形的仪表盘,上面显示着一些指针和刻度,用于表示某种状态或数值。这个示例程序可以用来演示一些实际应用场景,如车辆仪表盘、仪器仪表等。 在QML文件中,我们可以定义一个圆形的画布并在上面绘制各种图形元素。例如,我们可以添加一个圆形的外环作为仪表盘的边框,然后在中间添加一个圆形的刻度盘,并绘制出不同的刻度线。接着,我们可以添加指针和数字等元素,来显示具体的数值。 在QML中,我们可以使用一些内置的属性和表达式来实现各种动画效果。比如,我们可以定义一个动画来实现指针的旋转,使其根据仪表盘上的值进行相应的角度调整。还可以通过属性绑定来实时更新仪表盘的数值显示。 除了基本的仪表功能,我们还可以通过QML的扩展性来添加更多的交互功能。例如,通过添加鼠标事件处理器或触摸事件处理器,我们可以让用户通过拖动、滑动等方式来手动调整仪表盘的数值。 总之,Qt QML仪表Demo是一个通过使用Qt框架中的QML语言开发的示例程序,用于展示仪表效果。它可以帮助开发者更好地理解和学习QML的使用方法,并将其应用于实际项目中。 ### 回答2: Qt QML仪表Demo是一个使用Qt Quick绘制仪表盘界面的示例程序。QML是一种声明性语言,用于构建基于Qt的用户界面。 该示例程序展示了如何使用QML绘制一个具有平滑动画效果的仪表盘界面。在这个示例中,仪表盘界面由一个圆形背景、一个指针和一些标签组成。 首先,通过QML的绘图元素Path绘制一个圆形背景。可以设置背景的颜色、半径和边框。然后,使用Item元素嵌套一个Rectangle元素,用作指针。可以根据仪表盘当前值计算指针的角度,并将其旋转到正确的位置。 除了绘制背景和指针,示例中还包含一些标签,用于显示仪表盘的范围和单位。这些标签可以使用Text元素和属性绑定来实现。可以根据需要设置标签的颜色、大小和位置。 示例程序还包含一些动画效果,用于平滑地过渡指针的位置。可以使用Behavior元素和属性动画来定义这些效果。例如,可以定义一个角度动画,使指针在数值改变时顺时针或逆时针旋转到新的位置。 为了实现用户交互,示例程序还使用了一些QML的交互元素,如Slider和Button。可以通过Slider来改变仪表盘的数值,从而实现指针的动态变化。而Button可以用于重置仪表盘的数值。 综上所述,Qt QML仪表Demo是一个使用Qt Quick绘制仪表盘界面的示例程序,通过展示QML的绘图元素、属性绑定、动画效果和用户交互来实现这个功能。 ### 回答3: Qt QML仪表Demo是一个基于Qt Quick和QML语言编写的示例应用程序,用于展示仪表盘的功能和样式。 该示例应用程序主要由以下几个部分组成: 1. 仪表盘组件:通过使用Qt Quick Controls组件库中的样式,可以创建一个美观和交互性强的仪表盘界面。例如,可以使用圆形进度条来显示速度、转速等信息,并使用指针在刻度上指示当前数值。 2. 数据模型:为了展示仪表盘的功能,需要使用数据模型来模拟一些实际的数值。可以创建一个虚拟的数据模型,包含一些属性,如速度、转速等,并使用属性绑定机制将这些属性与仪表盘组件上的对应属性绑定起来。 3. 用户交互:通过用户交互,可以实现一些仪表盘的交互功能。例如,可以通过滑动或点击来改变仪表盘上的数值,或者通过A/B按钮来切换仪表盘的显示模式。 4. 动画效果:使用Qt Quick的动画系统,可以为仪表盘组件添加一些动画效果。例如,在数值变化时可以添加一个渐变动画效果,使仪表盘的指针从一个数值平滑过渡到另一个数值。 Qt QML仪表Demo不仅可以作为一个示例应用程序来展示如何创建仪表盘界面,还可以作为一个基础框架,用于开发具有仪表盘功能的实际应用程序。通过修改和扩展仪表盘组件、数据模型和用户交互等部分,可以满足不同应用场景的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值