【qml】QuickPaintedItem绘图,视觉错误旋转图例

一、说明

这个是qml的自会demo,受到视频 这是什么原理,看着也太好玩了的启发,用qml来实现。

绘制 还是要用QuickPaintedItem来实现,不为别的,就是想用GPU来绘制。

二、效果

在这里插入图片描述

三、RotateItem类

RotateItem.h

#ifndef ROTATEITEM_H
#define ROTATEITEM_H

#include <QQuickPaintedItem>

class RotateItem : public QQuickPaintedItem
{
    Q_OBJECT
public:
    RotateItem(QQuickItem *parent=0);

//signals:


    // QQuickPaintedItem interface
public:
    virtual void paint(QPainter *painter) override;

    int getSpeed() const;
    void setSpeed(int newSpeed);

signals:
    void speedChanged();

private:
    int speed=10;
    Q_PROPERTY(int speed READ getSpeed WRITE setSpeed NOTIFY speedChanged)
};

#endif // ROTATEITEM_H

RotateItem.cpp

#include "RotateItem.h"

#include <QPainter>
#include <QDebug>
#define qout if( 1 ) qDebug() << __FUNCTION__ << __LINE__ << ": "

RotateItem::RotateItem(QQuickItem *parent)
    :QQuickPaintedItem(parent)
{

}

void RotateItem::paint(QPainter *painter)
{
    auto itemSize = size();
//    qout << itemSize;

//    painter->setPen(Qt::cyan);
//    painter->drawLine(0,height()/2,width(),     height()/2);
//    painter->drawLine(width()/2, 0,width()/2,   height());

    painter->save();
    painter->translate(itemSize.width()/2,itemSize.height()/2);
    painter->rotate(speed);

    double side = qMin(itemSize.width(), itemSize.height())-1;
    QPen pen;
    pen.setWidth(side/8);
    painter->setPen(pen);

//    painter->drawRect(-side/2,-side/2,side,side);
    auto rect = QRect(-side/2+pen.width()/2,-side/2+pen.width()/2,
                      side-pen.width(),side-pen.width());

    side *=2./3;
    auto rect1 = QRect(-side/2+pen.width()/2,-side/2+pen.width()/2,
                      side-pen.width(),side-pen.width());

    side *=1./2;
    auto rect2 = QRect(-side/2+pen.width()/2,-side/2+pen.width()/2,
                      side-pen.width(),side-pen.width());

//    painter->drawEllipse(rect);
//    painter->drawEllipse(rect1);

    pen.setColor(QColor("#01113e"));
    pen.setCapStyle(Qt::FlatCap);
    pen.setJoinStyle(Qt::MiterJoin);
    painter->setPen(pen);

    // rect
    int args = 9;
    int spanAngle  = 360/args ;

    for (int i = 0; i < args; ++i) {
        painter->drawArc(rect,0,spanAngle*16/2);
        painter->rotate(-spanAngle);
    }

    // rect1
    args = 7;
    spanAngle  = 360/args ;

    for (int i = 0; i < args; ++i) {
        painter->drawArc(rect1,0,spanAngle*16/2);
        painter->rotate(-spanAngle);
    }

    // rect2
    args = 5;
    spanAngle  = 360/args ;

    for (int i = 0; i < args; ++i) {
        painter->drawArc(rect2,0,spanAngle*16/2);
        painter->rotate(-spanAngle);
    }


//    pen.setWidth(1);
//    painter->setPen(pen);
    painter->restore();

}

int RotateItem::getSpeed() const
{
    return speed;
}

void RotateItem::setSpeed(int newSpeed)
{
    if (speed == newSpeed)
        return;
    speed = newSpeed;
    update();
//    emit speedChanged();
}

四、main.qml

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15
import RotateItem 1.0

Item {
    anchors.fill: parent;

   RotateItem{
       id:rotateItem;
       anchors.fill: parent;
       fillColor: "#c4ccde"
   }

    Timer{
        id: timer
        interval: 1000/60;
        repeat: true
        triggeredOnStart: true;
        running: true
        property int speed: 45      // 特殊值:40
        property int idx: 0
        onTriggered: {
            rotateItem.speed = speed * idx++;
            idx %= (360/speed);
        }
    }
    MouseArea{
        anchors.fill: parent
        onClicked: {
            timer.running = !timer.running;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值