Qt实现滚动图片效果

转载 2016年04月11日 11:00:12

http://blog.sina.com.cn/s/blog_75deeddd0100tu2o.html

滚动图片效果
.h文件
#ifndef ROLLPICTURE_H
#define ROLLPICTURE_H
#include <QWidget>
#include <QObject>
#include <QLabel>
#include <QState>
#include <QStateMachine>
#include <QParallelAnimationGroup>
#include <QPropertyAnimation>
#include <QSignalTransition>
#include <QDebug>
class RollPicture : public QWidget
{
    Q_OBJECT
public:
    explicit RollPicture(QStringList picList,QSize picSize,int picCount,
                         int speedTime,int space = 0,QWidget *parent = 0);
    void resume();//恢复
    void pause();//暂停
signals:
    void AnimationStart();
    void nextState();
public slots:
    void start();
    void changeItemPic();
private:
    void initItem();
    void initStates();
    void initCoord();
    void initAnimationGroup();
private:
    QStringList m_picList;
    QSize m_picSize;
    int m_picCount;
    int m_speedTime;
    int m_space;
    QSize m_itemSize;
    int m_itemCount;
    int m_picWindowCount;
    QState *m_state;                   //??
    QLabel *m_item;
    QParallelAnimationGroup *m_group;  //
    QPropertyAnimation *m_anim;        //
    QStateMachine m_scrollMachine;     //
    QSignalTransition *m_transStart;   //
    QSignalTransition *m_trans;        //
    QSignalTransition *m_transEnd;     //
    QList <QState *> m_stateList;      //
    QList <QLabel *> m_itemList;
    QList <QPoint> m_picPosList;
};
#endif // ROLLPICTURE_H


.cpp文件
#include "rollpicture.h"

RollPicture::RollPicture(QStringList picList, QSize picSize, int picCount,
                         int speedTime, int space, QWidget *parent) : QWidget(parent),
                         m_picList(picList),m_picSize(picSize),m_picCount(picCount),
                         m_speedTime(speedTime),m_space(space)
{
    this->m_itemSize = QSize(this->m_space + this->m_picSize.width(),this->m_picSize.height());
    this->m_group = new QParallelAnimationGroup;
    this->m_itemCount = this->m_picCount;
    this->m_picWindowCount = 0;
    this->initItem();
    this->initCoord();
    this->initStates();
    this->initAnimationGroup();
}
void RollPicture::initItem()
{
    this->m_itemList.clear();
    for(int i = 0;i < m_picCount; i++)
    {
        this->m_item = new QLabel(this);
        this->m_item->setPixmap(this->m_picList.at(i));
        this->m_item->resize(m_picSize);
        this->m_itemList.append(m_item);
    }
}
void RollPicture::initCoord()
{
    QPoint startPoint(0 - this->m_itemSize.width(),0);
    for(int i = 0; i < this->m_picCount; i++)
    {
        this->m_picPosList.append(QPoint(startPoint.x() + i * this->m_itemSize.width(),startPoint.y()));
    }
}
void RollPicture::initStates()
{
    this->m_state = 0;
    for(int i = 0; i < this->m_picCount; i++)
    {
        this->m_state = new QState();
        this->m_stateList.append(this->m_state);
    }
}
void RollPicture::initAnimationGroup()
{
    for ( int i = 0; i < this->m_itemList.size(); ++i ) {
        this->m_anim = new QPropertyAnimation(this->m_itemList.at(i), "pos",this);
        this->m_anim->setDuration( this->m_speedTime );
        this->m_group->addAnimation( this->m_anim );
    }
    connect(this->m_group,SIGNAL(finished()),this,SLOT(changeItemPic()));
    this->m_transStart = this->m_stateList.at(0)->addTransition( this,SIGNAL(AnimationStart()),this->m_stateList.at(1) );
    this->m_transStart->addAnimation( this->m_group );
    for ( int i = 0; i < this->m_picCount; i++ )
    {
        for ( int j = 0; j < this->m_picCount; j++ )
        {
            int posIndex = j - i;
            if (posIndex < 0)
            {
                posIndex += this->m_picCount;
            }
        this->m_stateList.at(i)->assignProperty(this->m_itemList.at(j), "pos",this->m_picPosList.at(posIndex));
        if ( posIndex == ( this->m_picCount-1 ) )
        {
            this->m_stateList.at(i)->assignProperty(this->m_itemList.at(j),"visible",false);
        } else
        {
                this->m_stateList.at(i)->assignProperty(this->m_itemList.at(j),"visible",true);
        }
        }
        this->m_scrollMachine.addState( this->m_stateList.at(i));
        if ( i != this->m_picCount - 1 )
        {
            this->m_trans = this->m_stateList.at(i)->addTransition(this, SIGNAL(nextState()),this->m_stateList.at( i+1 ));
            this->m_trans->addAnimation(this->m_group);
        } else
        {
            this->m_transEnd = this->m_stateList.at(i)->addTransition(this,SIGNAL(nextState()),this->m_stateList.at(0));
            this->m_transEnd->addAnimation(this->m_group);
        }
    }
    this->m_scrollMachine.setInitialState(this->m_stateList.at(0));
    this->m_scrollMachine.start();
}
void RollPicture::changeItemPic()
{
    if(this->m_picWindowCount % this->m_picCount == 0)
    {
        this->m_picWindowCount = 0;
    }
    if(this->m_itemCount >= this->m_picList.size())
    {
        this->m_itemCount -= this->m_picList.size();
    }
    this->m_itemList.at(this->m_picWindowCount)->setPixmap(this->m_picList.at(this->m_itemCount));
    this->m_picWindowCount++;
    this->m_itemCount++;
    emit this->nextState();
}
void RollPicture::start()
{
    emit this->AnimationStart();
}
void RollPicture::resume()
{
    if(this->m_picList.at(0) != "NULL")
    {
        if(this->m_group->state() == QAbstractAnimation::Stopped)
        {
            this->start();
        }else if(this->m_group->state() == QAbstractAnimation::Paused)
        {
            this->m_group->setPaused(false);
        }
    }else
    {
        qDebug() << "this ApicAnimationstate has stop";
    }
}
void RollPicture::pause()
{
    if(this->m_picList.at(0)!="NULL")
    {
        this->m_group->setPaused(true);
    }else
    {
        qDebug() << "this Apicanimationstate has stop!";
    }
}

[转载]Qt实现滚动图片效果

原文地址:Qt实现滚动图片效果作者:中药一付 滚动图片效果 .h文件 #ifndef ROLLPICTURE_H #define ROLLPICTURE_H #include  #...

QT使用scrollarea显示图片,完美解决方案

需求:           在界面上点击“显示图片”按钮,会调用scrollarea窗口显示图片,窗口大小能根据图片大小自动调整,但是最大为1024*768,图片过大就要有滚动条来显示 IDE环境: ...
  • jk110333
  • jk110333
  • 2013年09月04日 11:46
  • 10286

qt程序实现多个图片连续显示效果像动画一样

qt学习也快一个月了,最近想做一个有趣的程序。效果是这样的:通过定时器连续显示几幅图片,串联起来看像是动的一样,我在网上找了几幅关于小鸡破壳而出那个有趣的场景,然后通过程序实现效果就是小鸡破壳而出。 ...

如何实现使用QtQuick循环轮播图,并支持用户滑动切换

循环轮播图,并支持用户滑动切换

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

QML自动循环轮播图

qml轮播图 自动循环滚动图 无限循环展示

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Qt之实现图片滑动效果

一、简介         博客中发现有作者写的仿360的代码,觉得其中图片滑动的效果很有意思,特提取其中的代码。并加上类似mac的画面移动的动画效果。 二、详解 1、代码一:界面滑动(QWi...

Qt自绘滚动条

核心就是自定义一个派生自QWindowStyple类,重载drawScrollBarControls方法 最后在自己的QApplication中应用这个style 自定义style中绘制滚动条...
  • koilin
  • koilin
  • 2012年07月16日 17:23
  • 3280
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Qt实现滚动图片效果
举报原因:
原因补充:

(最多只允许输入30个字)