Qt编写自定义控件:唱片播放控件

效果:

代码:

#ifndef PLAYSTATECONTROL_H
#define PLAYSTATECONTROL_H

#include <QWidget>
#include <QTimer>

class PlayStateControl : public QWidget
{
    Q_OBJECT

public:
    PlayStateControl(QWidget *parent = nullptr);
    ~PlayStateControl()override;

protected:
    void paintEvent(QPaintEvent *event)override;
    void mousePressEvent(QMouseEvent *event)override;

private:
    QPixmap diskPixmap;
    QPixmap polePixmap;
    QPixmap centerPixmap;

    bool isPlaying{true};
    qreal angle{0};
    QTimer angleTimer;
    qreal poleSpinAngle{0};
    bool poleIsSpin{false};
    QTimer poleSpinTimer;
};
#endif // PLAYSTATECONTROL_H
#include "playstatecontrol.h"
#include <QPainter>
#include <QPaintEvent>
#include <QPainterPath>
#include <QDebug>

PlayStateControl::PlayStateControl(QWidget *parent)
    : QWidget(parent)
{
    setPalette(Qt::white);
    diskPixmap.load(":/mediaDisk.png");
    polePixmap.load(":/Pole.png");
    centerPixmap.load(":/jay.jpg");
    setMinimumSize(300,250);

    connect(&angleTimer,&QTimer::timeout,[this]
    {
        angle += 1.0;
        if(angle == 360.0)
            angle = 0.0;
        update();
    });
    angleTimer.setInterval(40);

    connect(&poleSpinTimer,&QTimer::timeout,[this]
    {
        if(isPlaying)
        {
            poleSpinAngle -= 1.0;
            if(poleSpinAngle == 0.0)
            {
                poleSpinTimer.stop();
            }

        }
        else
        {
            poleSpinAngle += 1.0;
            if(poleSpinAngle > 25.0)
            {
                poleSpinTimer.stop();
            }
        }
        update();
    });
    poleSpinTimer.setInterval(20);
}

PlayStateControl::~PlayStateControl()
{
}

void PlayStateControl::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing,true);
    painter.setRenderHint(QPainter::SmoothPixmapTransform,true);

    const auto rect = event->rect();
    auto radius = std::min(rect.width(),rect.height()) / 2 - 25;
    QRect rectangle(-radius,-radius,radius * 2,radius * 2);

    painter.translate(rect.center());
    painter.setPen(Qt::transparent);

    painter.drawPixmap(rectangle,diskPixmap);


    auto centerImgRadius = radius / 1.6;
    auto centerImgRect = QRect(-centerImgRadius, -centerImgRadius, centerImgRadius*2, centerImgRadius*2);

    painter.save();
    QRegion maskedRegion(centerImgRect, QRegion::Ellipse);
    painter.setClipRegion(maskedRegion);
    painter.rotate(angle);
    painter.drawPixmap(centerImgRect,centerPixmap);
    painter.restore();

    auto poleRect = QRect(rectangle.topRight().x(),rectangle.topRight().y(),rect.width()*0.15,rect.height()*0.5);
    auto polePixmapTemp = polePixmap.scaled(poleRect.size(),Qt::KeepAspectRatio);
    auto difference = polePixmapTemp.width() + radius - (rect.width()/2);
    if(difference > 0)
    {
        poleRect.setX(poleRect.x() - difference);
    }

    painter.save();
    painter.translate(poleRect.topLeft());
    painter.rotate(poleSpinAngle);
    painter.drawPixmap(QPoint(0,0),polePixmapTemp);
    painter.restore();
}

void PlayStateControl::mousePressEvent(QMouseEvent *event)
{
    isPlaying = !isPlaying;
    poleIsSpin = true;
    poleSpinTimer.start();
    if(isPlaying)
    {
        angleTimer.stop();
    }
    else
    {
        angleTimer.start();
    }
    QWidget::mousePressEvent(event);
}

用到的图片: 

 

猜你喜欢

转载自blog.csdn.net/kenfan1647/article/details/120970000