[ Qt 프로그래밍 ] 애니메이션 예제 (QPropertyAnimation)


animation_001.zip


cookie dance.exe


전에 썼던 글에서 QPropertyAnimation 클래스를 직접 사용한 프로그램을 만들어봤습니다.

사실 쓸 함수는 별로 없는데 애니메이션 클래스가 워낙 눈에 쏙쏙 들어와서 재밌게 가지고 놀 수 있습니다.

 


 

 

위 사진의 녀석은 슈렉에도 나왔던 진저맨이라는 녀석입니다.

워낙 귀여운 캐릭터라 많이 이들이 좋아했는데, 이번에는 이녀석을 마우스 클릭할 때마다 바탕화면에

 이리저리 도망다니는 애니메이션을 만들었습니다.

 

이 프로그램을 만들면서 사용한 유용한 코드를 살펴보겠습니다.


Colored By Color Scripter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "widget.h"
#include "ui_widget.h"
#include <QPropertyAnimation>
#include <QDesktopWidget> //PC의 해상도를 알수있는 클래스
#include <QTime> //랜덤값을 위해 현재 시간의 밀리초를 알려주는 클래스
 
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    setLayout(ui->verticalLayout);
    setWindowFlags(Qt::FramelessWindowHint); //프로그램의 프레임을 제거하는 함수
    setAttribute(Qt::WA_TranslucentBackground,true); //프로그램을 완전 투명하게 하는 함수
    setWindowIcon(QPixmap(":/new/prefix1/cookie.png"));  //프로그램의 아이콘을 설정(리소스에 추가해둠)
    setWindowTitle("Cookie Dance"); //프로그램의 제목을 정함
 
    qsrand(QTime::currentTime().msec());//qrand()랜덤함수를 위해 시드값을 넣어줌(마인크래프트에도 비슷한 것 존재)
 
    dw=new QDesktopWidget(); //데스크탑 클래스 생성
 
    ui->pushButton->setLayout(ui->verticalLayout_2);
    ui->label->setPixmap(QPixmap(":/new/prefix1/cookie.png")); //레이블에 쿠키 사진 넣음
 
}
 
void Widget::resizeEvent(QResizeEvent *) //위젯의 크기가 변하면 자동호출되는 함수, 헤더파일에도 추가해야함
{
    ui->label->setPixmap(QPixmap(":/new/prefix1/cookie.png").scaled(ui->pushButton->size())); //scale 함수로 사진 크기 변형후 반환까지 해줌
}
 
Widget::~Widget()
{
    delete ui;
    delete dw;
}
 
void Widget::on_pushButton_clicked()
{
    QPropertyAnimation* animation=new QPropertyAnimation(this,"geometry"); //애니메이션 클래스
    animation->setDuration(1000); //애니메이션 시간(msec)
    animation->setStartValue(QRect(geometry().x(),geometry().y(),this->geometry().width(),this->geometry().height())); //처음 위치와 크기
    animation->setEndValue(QRect(qrand()%(dw->width()-50),qrand()%(dw->height()-50),qrand()%500,qrand()%500)); //종료후 위치와 크기
    animation->setEasingCurve(QEasingCurve::InOutBack);// 변하는 형식
 
    animation->start(); //시작
}
 

 

코드의 설명은 주석을 통해 확인하시면 됩니다.

이상입니다.