目录
Qt轮播图动画实现
轮播图在网页上挺常见的,在Qt中可以用属性动画来实现。
需要注意几点
- 计算好需要移动图片的始末位置
- 在合适的时候将要显示的图片添加到布局,并将要消失的图片移除布局
- 动画结束时,把消失的图片删除
- 当动画还没结束,又有新的动作时,应马上结束动画开始新动作
看代码。
wheelwidget.h
#pragma once
#include "QObject"
#include <QWidget>
#include <QButtonGroup>
#include <QSize>
#include <QDir>
#include <QFileInfo>
#include <QPropertyAnimation>
#include <QTimer>
#include <QDebug>
#include <QThread>
#include <QListWidgetItem>
#include "ui_wheelwidget.h"
#include "QParallelAnimationGroup"
#include <QEasingCurve>
//轮播图类,实现轮播效果
class wheelwidget : public QWidget
{
Q_OBJECT
public:
wheelwidget(QWidget *parent = Q_NULLPTR);
~wheelwidget();
public slots:
void addItem(QFileInfo fileinfo);
void puticeChanged(int row);
private:
void startAnimation();
Ui::wheelwidget ui;
QButtonGroup* m_pButtonGroup;
QSize m_iconSize;
QParallelAnimationGroup* m_pAnimGroup;
int m_iDuration = 1000; //动画持续时间
int m_ipreRow = 0;
QWidget* m_pShouleDel = nullptr;
QEasingCurve::Type m_eEasingCurve = QEasingCurve::OutBounce;
QString m_PituceDirPath = u8"H:/秦时明月/";
};
//文件读取类
class readPuticeFile : public QObject
{
Q_OBJECT
public:
readPuticeFile(QObject* parent = nullptr)
:QObject(parent)
{
}
void setDirPath(QString path) {
m_DirPath = path; }
signals:
void sigAddItem(QFileInfo fileinfo);
void sigOver();
public slots:
void startRead()
{
qDebug() << QThread::currentThreadId();
QDir dir(u8"H:/秦时明月/");
auto filelist = dir.entryInfoList();
for (auto& file : filelist)
{
emit sigAddItem(file);
// QThread::msleep(100);
}
emit sigOver();
}
private:
QString m_DirPath;
};
wheelwidget.cpp
#include "wheelwidget.h"
#include <QIcon>
#include <QMetaObject>
#include <QMetaEnum>
wheelwidget::wheelwidget(QWidget *parent)
: QWidget(parent),
m_iconSize