该控件参考了feiyangqingyun博主的博文:Qt编写自定义控件24-图片轮播控件https://blog.csdn.net/feiyangqingyun/article/details/91315428
并在其基础上稍加修改并新添了鼠标悬停导航器切换图片的功能。
效果图
头文件
#ifndef QWHADVERTISINGPAGE_H
#define QWHADVERTISINGPAGE_H
#include <QWidget>
#include <QPushButton>
#include <QPaintEvent>
#include <QPainter>
#include <QTimer>
#include <QPropertyAnimation>
#include <QSpacerItem>
#include <QHBoxLayout>
#include <QEvent>
class QWHAdvertisingPage : public QWidget
{
Q_OBJECT
Q_ENUMS(NavType)
Q_ENUMS(NavPos)
Q_PROPERTY(int offsetX READ getOffsetX WRITE setOffsetX)
public:
enum NavType
{
Rectangle, //矩形
RoundedRectangle, //圆角矩形
Circle, //圆形
Concentric_circle, //同心圆
Ellipse, //椭圆
AnimationEllipse, //动画椭圆
};
enum NavPos
{
Left, //左侧
Center, //居中
Right //右侧
};
explicit QWHAdvertisingPage(QWidget *parent = nullptr);
public:
//设置轮播方向,true表示图片向左移动,false表示图片向右移动
void setPlayDir(bool turnLeft);
//设置导航器序号是否显示
void setNavTextVisible(bool textVisible);
//设置鼠标是否悬停
void setMouseHoverStop(bool mouseHoverStop);
//设置鼠标悬停导航器按钮时是否图片切换,若为true,则悬停导航器按钮时切换图片;否则点击导航器按钮时切换图片
void setMouseNavHoverChange(bool mouseNavHoverChange);
//设置导航器样式
void setNavType(NavType navType);
//设置导航器位置
void setNavPos(NavPos navPos);
//设置导航器按钮大小
void setNavBtnSize(QSize navBtnSize);
//设置导航器序号(文本)颜色
void setNavTextColor(QColor navTextColor);
//设置导航器常规颜色
void setNavColor(QColor navColor);
//设置导航器悬停颜色
void setNavHoverColor(QColor navHoverColor);
//设置导航器按下颜色
void setNavPressColor(QColor navPressColor);
//设置广告图片信息
void setPixmap(const QList<QPixmap *> &pixmaps);
//设置图片切换间隔(图片轮换间隔,包含了图片动画间隔,单位:毫秒)
void setChangePixmapInterVal(int msecs);
//设置图片移动间隔(图片动画间隔,单位:毫秒)
void setPixmapAnimationInterval(int msecs);
//获取轮播方向,true表示图片向左移动,false表示图片向右移动
bool getPlayDir() const;
//获取导航器序号是否显示
bool getNavTextVisible() const;
//获取鼠标是否悬停
bool getMouseHoverStop() const;
//获取鼠标悬停导航器按钮时是否图片切换,若为true,则悬停导航器按钮时切换图片;否则点击导航器按钮时切换图片
bool getMouseNavHoverChange() const;
//获取导航器样式
NavType getNavType() const;
//获取导航器位置
NavPos getNavPos() const;
//获取导航器按钮大小
QSize getNavBtnSize() const;
//获取导航器序号(文本)颜色
QColor getNavTextColor() const;
//获取导航器常规颜色
QColor getNavColor() const;
//获取导航器悬停颜色
QColor getNavHoverColor() const;
//获取导航器按下颜色
QColor getNavPressColor() const;
//获取广告图片信息
QList<QPixmap *> getPixmap() const;
//获取图片切换间隔(图片轮换间隔,包含了图片动画间隔,单位:毫秒)
int getChangePixmapInterVal() const;
//获取图片移动间隔(图片动画间隔,单位:毫秒)
int getPixmapAnimationInterval() const;
protected:
void paintEvent(QPaintEvent *event);
void enterEvent(QEvent *event);
void leaveEvent(QEvent *event);
bool eventFilter(QObject *obj, QEvent *ev);
signals:
void currentIndexChanged(int index);
private:
void initForm();
void setOffsetX(int offsetX);
int getOffsetX() const;
private slots:
void onTimeout(); //定时器触发
void onClicked(); //导航新点击
private:
bool m_turnLeft; //轮播方向
bool m_navTextVisible; //显示导航器序号
bool m_mouseHoverStop; //是否鼠标悬停
bool m_mouseNavHoverChange; //是否鼠标悬停导航器按钮时图片切换
NavType m_navType; //导航器样式
NavPos m_navPos; //导航器位置
QSize m_navBtnSize; //导航器按钮大小
QColor m_navTextColor; //导航器序号颜色
QColor m_navColor; //导航器颜色
QColor m_navHoverColor; //导航器悬停颜色
QColor m_navPressColor; //导航器按下颜色
QList<QPixmap *> m_pixmaps; //存储图片信息
int m_changePixmapInterVal; //图片切换间隔(图片轮换间隔,包含了图片动画间隔,单位:毫秒)
int m_PixmapAnimationInterval; //图片移动间隔(图片动画间隔,单位:毫秒)
int m_curIndex; //当前图片索引
int m_preIndex; //之前图片索引
int m_offsetX; //图片偏移量
//布局控件
QWidget *m_navWidget; //存放导航器信息
QHBoxLayout *m_hNavLayout; //导航信息窗体布局
QHBoxLayout *m_hLayout; //页面底部导航器整体布局
QSpacerItem *m_vSpacerItem; //导航器上册弹簧
QSpacerItem *m_lSpacerItem; //导航器左侧弹簧
QSpacerItem *m_rSpacerItem; //导航器右侧弹簧
QList<QPushButton *> m_btns; //存储导航控件
//轮播控件
QTimer *m_timer; //定时器轮播广告
QPropertyAnimation *m_animation; //属性动画
};
#endif // QWHADVERTISINGPAGE_H