您的位置:首页 > 编程语言 > Qt开发

QT:界面切换之飞入飞出

2015-11-12 09:19 603 查看
RT,

用QT实现的一个简单动画,比较简单

所以,直接上代码,呵呵。

[cpp] view
plaincopyprint?

//tqt.h

#ifndef TQT_H_

#define TQT_H_



#include <QtGui>

#include <QtCore>



class Widget : public QWidget

{

Q_OBJECT

private:

QFrame *frame[10];

QPushButton *prevButton;

QPushButton *nextButton;

QPropertyAnimation *animation1;

QPropertyAnimation *animation2;

QSequentialAnimationGroup *animationGroup;



QSize winSize;

int index;

bool isChanging;



protected:

void resizeEvent(QResizeEvent *event);



public:

Widget(QWidget *parent = 0);

~Widget();



public slots:

void clickedPrevButton();

void clickedNextButton();

void animationFinished();

};





#endif







//tqt.cpp

#include "tqt.h"



Widget::Widget(QWidget *parent /* = 0 */)

: QWidget(parent)

{

setWindowTitle("Widget");

resize(400, 300);



animation1 = new QPropertyAnimation(this);

animation2 = new QPropertyAnimation(this);

animationGroup = new QSequentialAnimationGroup;



prevButton = new QPushButton("prev", this);

nextButton = new QPushButton("next", this);

QHBoxLayout *subLayout = new QHBoxLayout;

QVBoxLayout *layout = new QVBoxLayout;

subLayout->addStretch();

subLayout->addWidget(prevButton);

subLayout->addWidget(nextButton);

subLayout->addStretch();

layout->addStretch();

layout->addLayout(subLayout);

setLayout(layout);



winSize = size();

index = 0;

for(int i=0; i<10; i++)

{

frame[i] = new QFrame(this);

frame[i]->setObjectName("avatar");

//0.jpg~9.jpg是当前目录下的10张图片

QString str = QString("QFrame#avatar{border-image:url(%1.jpg)}")

.arg( QString::number(i) );

frame[i]->setStyleSheet(str);

}

prevButton->setEnabled(false);



animation1->setStartValue( QPoint(winSize.width()/3, 10) );

animation1->setEndValue( QPoint(winSize.width(), 10) );

animation1->setDuration(2000);

animation1->setPropertyName("pos");

animation2->setStartValue( QPoint(-winSize.width()/3, 10) );

animation2->setEndValue( QPoint(winSize.width()/3, 10) );

animation2->setDuration(2000);

animation2->setPropertyName("pos");

animationGroup->addAnimation(animation1);

animationGroup->addAnimation(animation2);



index = 0;

animation1->setTargetObject(frame[index]);

isChanging = false;

connect(prevButton, SIGNAL(clicked()), this, SLOT(clickedPrevButton()));

connect(nextButton, SIGNAL(clicked()), this, SLOT(clickedNextButton()));

connect(animationGroup, SIGNAL(finished()), this, SLOT(animationFinished()));

}



Widget::~Widget()

{



}



void Widget::resizeEvent(QResizeEvent *event)

{

winSize = size();

for(int i=0; i<10; i++)

frame[i]->setGeometry(-winSize.width()/3, 10, winSize.width()/3, winSize.height()-50);

frame[index]->setGeometry(winSize.width()/3, 10, winSize.width()/3, winSize.height()-50);



animation1->setStartValue( QPoint(winSize.width()/3, 10) );

animation1->setEndValue( QPoint(winSize.width(), 10) );

animation2->setStartValue( QPoint(-winSize.width()/3, 10) );

animation2->setEndValue( QPoint(winSize.width()/3, 10) );



}



void Widget::clickedPrevButton()

{

if(isChanging)

return;

nextButton->setEnabled(true);

isChanging = true;

setFixedSize(winSize.width(), winSize.height());

index--;

animation2->setTargetObject(frame[index]);

animationGroup->start();

if(index <= 0)

prevButton->setEnabled(false);

}





void Widget::clickedNextButton()

{

if(isChanging)

return;

prevButton->setEnabled(true);

isChanging = true;

setFixedSize(winSize.width(), winSize.height());

index++;

animation2->setTargetObject(frame[index]);

animationGroup->start();

if(index >= 9)

nextButton->setEnabled(false);

}



void Widget::animationFinished()

{

isChanging = false;

setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);

animation1->setTargetObject(frame[index]);

}







//main.cpp

#include "tqt.h"



int main(int argc, char **argv)

{

QApplication app(argc, argv);

Widget *widget = new Widget;

widget->show();

return app.exec();

}

本程序有10张图片,按prev, next可前后切换

FROM: http://blog.csdn.net/small_qch/article/details/6858611
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: