Qt绘制图片轮播增强版

在之前写的轮播控件基础上,添加新的轮播类型。
效果图
由于录制原因,鼠标进入控件时的事件被录制软件屏蔽了。左右两侧是有切换图片的绘制。
在这里插入图片描述
两侧:
在这里插入图片描述
头文件

#ifndef QWHADVERTISINGPAGEEX_H
#define QWHADVERTISINGPAGEEX_H

#include <QWidget>
#include <QPushButton>
#include <QPaintEvent>
#include <QPainter>
#include <QTimer>
#include <QPropertyAnimation>
#include <QSpacerItem>
#include <QHBoxLayout>
#include <QEvent>
#include <QResizeEvent>
#include <QMouseEvent>

#define Max 1
#define Min 0.6
//#define COUNT 6
#define SHOW 5


class QWHAdvertisingPageEx : public QWidget
{
    Q_OBJECT
    Q_ENUMS(NavType)
    Q_ENUMS(NavPos)
    Q_PROPERTY(int offsetX READ getOffsetX WRITE setOffsetX)
public:
    enum PlayType
    {
      Normal,   //常规播放
      Animation //动画播放
    };

    enum NavType
    {
        Rectangle,          //矩形
        RoundedRectangle,   //圆角矩形
        Circle,             //圆形
        Concentric_circle,  //同心圆
        Ellipse,            //椭圆
        AnimationEllipse,   //动画椭圆
    };
    enum NavPos
    {
        Left,   //左侧
        Center, //居中
        Right   //右侧
    };

    explicit QWHAdvertisingPageEx(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 setBgColor(QColor bgColor);
    //设置导航器序号(文本)颜色
    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 getBgColor()                 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 drawBothSidesArea(QPainter *painter);
    //绘制普通轮播图
    void drawNormalType(QPainter *painter);
    //绘制动画轮播图
    void drawAnimationType(QPainter *painter);

    void enterEvent(QEvent *event);
    void leaveEvent(QEvent *event);
    void mousePressEvent(QMouseEvent *event);
    bool eventFilter(QObject *obj, QEvent *ev);
    void resizeEvent(QResizeEvent *event);

signals:
    void currentIndexChanged(int index);

private:
    void initForm();
    void setOffsetX(int offsetX);
    int getOffsetX() const;
    //获取下一张图片索引
    int nextIndex(int curIndex);
    //获取前一张图片索引
    int preIndex(int curIndex);

private slots:
    void onTimeout();   //定时器触发
    void onClicked();   //导航新点击

private:
    bool m_turnLeft;                    //轮播方向
    bool m_navTextVisible;              //显示导航器序号
    bool m_mouseHoverStop;              //是否鼠标悬停
    bool m_mouseNavHoverChange;         //是否鼠标悬停导航器按钮时图片切换
    PlayType m_playType;                //轮播样式
    NavType m_navType;                  //导航器样式
    NavPos m_navPos;                    //导航器位置
    QSize m_navBtnSize;                 //导航器按钮大小
    QColor m_bgColor;                   //背景颜色
    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;                      //图片偏移量
    bool m_isMouseIn;                   //鼠标进入该控件
    bool m_dirChanged;                  //点击左右区域导致轮播方向与之前改变,true表示改变
    //布局控件
    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 // QWHADVERTISINGPAGEEX_H
发布了228 篇原创文章 · 获赞 44 · 访问量 10万+

猜你喜欢

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