QT动画

本代码通过选择文件导入图片,然后用GraphicsView显示,点击开始动画(渐隐,渐显,变小,变大,旋转)
graphicsSpeak.h
#ifndef GRAPHICSITEM_H
#define GRAPHICSITEM_H

#include <QGraphicsPixmapItem>
#include <QGraphicsWidget>
#include <QPainter>
#include <QRect>
#include <QPixmap>
#include <QWidget>
#include <QDebug>
#include <QPropertyAnimation>
#include <QObject>
#include <QWindow>


class GraphicsItem : public QGraphicsWidget
{
    Q_OBJECT
    Q_PROPERTY(QRectF geometry  READ geometry  WRITE setGeometry)
    Q_PROPERTY(QPointF pos READ pos WRITE setPos)
    Q_PROPERTY(qreal rotation READ rotation WRITE setRotation)
    Q_PROPERTY(qreal opacity READ opacity WRITE setOpacity)
public:
    GraphicsItem(QPixmap *pixmap);
    QRectF boundingRect() const;
    void paint(QPainter *painter,const QStyleOptionGraphicsItem *option,
               QWidget *widget);

private:
    QRect my_rect;
    QPixmap *my_Pixmap;

};

#endif // GRAPHICSITEM_H

graphicsSpeak.cpp
#include "graphicsitem.h"

GraphicsItem::GraphicsItem(QPixmap *pixmap)
{
    my_Pixmap = new QPixmap();
    my_Pixmap = pixmap;
}
QRectF GraphicsItem::boundingRect() const
{
    return QRectF(-this->rect().width()/2,-this->rect().height()/2,this->rect().width(),this->rect().height());
}

void GraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    painter->drawPixmap(boundingRect().toRect(),*my_Pixmap);
}

MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsWidget>
#include <QPropertyAnimation>
#include <QMouseEvent>
#include <QFileDialog>
#include <QMessageBox>
#include "graphicsitem.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
protected:
    void mousePressEvent(QMouseEvent *event);


private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::MainWindow *ui;
    GraphicsItem *my_graphicsItem;
    QPropertyAnimation *animation1;
    QPropertyAnimation *animation2;
    QPropertyAnimation *animation3;
    QGraphicsScene *scene;
    QPixmap pixmap;
};

#endif // MAINWINDOW_H

MainWindiw.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    scene = new QGraphicsScene();
    scene->setBackgroundBrush(Qt::black);
    ui->graphicsView->setScene(scene);

    ui->pushButton->setToolTip("选择文件");
    animation1 = new QPropertyAnimation();
    animation2 = new QPropertyAnimation();
    animation3 = new QPropertyAnimation();
    animation1->setDuration(3000);
    animation1->setStartValue(360);
    animation1->setEndValue(0);
    animation1->setLoopCount(-1);

    animation3->setDuration(3000);
    animation3->setStartValue(0);
    animation3->setEndValue(1);

    animation2->setDuration(5000);
    animation2->setStartValue(QRect(0,0,97,46));
    animation2->setKeyValueAt(0.5,QRect(0,0,97*4,46*4));
    animation2->setEndValue(QRect(-550,-300,97,46));

    connect(animation2,SIGNAL(finished()),animation1,SLOT(start()));
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if(animation2 != NULL&&animation2->state() != QAbstractAnimation::Running){
        animation2->start();
    }
}

void MainWindow::on_pushButton_clicked()
{
    QString path = QFileDialog::getOpenFileName(this, tr("Open Image"), ".", tr("Image Files( *.png)"));
    if(!path.isEmpty())
    {
        ui->lineEdit->setText(path);
    }
    else{
       QMessageBox::warning(NULL,"waring","请选择图片",QMessageBox::Yes|QMessageBox::No,QMessageBox::Yes);
    }
}

void MainWindow::on_pushButton_2_clicked()
{
    pixmap.load(ui->lineEdit->text());
    my_graphicsItem = new GraphicsItem(&pixmap);
    scene->addItem(my_graphicsItem);
    animation1->setTargetObject(my_graphicsItem);
    animation2->setTargetObject(my_graphicsItem);
    animation3->setTargetObject(my_graphicsItem);
    animation1->setPropertyName("rotation");
    animation2->setPropertyName("geometry");
    animation3->setPropertyName("opacity");
    animation3->start();
}

main.cpp
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值