Qt绘制图片轮播控件

该控件参考了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
发布了228 篇原创文章 · 获赞 44 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq_40945965/article/details/104326492