如何使QLabel 加载的gif动态图片使其背景透明,与背景色一致

在做Qt项目时遇到加载Gif动态图片,但QLabel设置的gif图片,背景图无法透明,需要重写QLabel,下面是代码:

.h头文件

#include <QtWidgets>

class CMoviceLabel : public QLabel
{
    Q_OBJECT;
public:
    CMoviceLabel(QWidget* parent = NULL);
private:
    void paintEvent(QPaintEvent *event);
    //setOpacity
};

.cpp文件

CMoviceLabel::CMoviceLabel(QWidget* parent) : QLabel(parent)
{

}

void CMoviceLabel::paintEvent(QPaintEvent *event)

    QStyle *style = QWidget::style();
    QPainter painter(this);
    painter.setOpacity(0.5);
    //drawFrame(&painter);
    QRect cr = contentsRect();
    cr.adjust(margin(), margin(), -margin(), -margin());
    int align = QStyle::visualAlignment(text() == "" ? Qt::LeftToRight : layoutDirection(), alignment());

    if (movie()) 
    {
        if (hasScaledContents())
            style->drawItemPixmap(&painter, cr, align, movie()->currentPixmap().scaled(cr.size()));
        else
            style->drawItemPixmap(&painter, cr, align, movie()->currentPixmap());
    }
}
实现动态加载的的代码:

.h文件

class CLoaddingPanel2 : public QWidget
{
    Q_OBJECT;
public:
    CLoaddingPanel2(QWidget* parent = NULL);

private: 
    
    void paintEvent(QPaintEvent *event);
    void showEvent(QShowEvent *event);
    void hideEvent(QHideEvent *event);
    QMovie* m_mvGifLoadding;
    CMoviceLabel* m_lbMv;
};

.cpp代码

CLoaddingPanel2::CLoaddingPanel2(QWidget* parent) :QWidget(parent)
{
    QVBoxLayout* vblMain = new QVBoxLayout(this);
    setWindowFlags(Qt::FramelessWindowHint);//无边框
    setAttribute(Qt::WA_TranslucentBackground);//背景透明

    m_mvGifLoadding = new QMovie(":/res/loading/loading2.gif");
    m_lbMv = new CMoviceLabel(this);
    m_lbMv->setFixedSize(379, 381);
    m_lbMv->setWindowFlags(Qt::FramelessWindowHint);
    m_lbMv->setAttribute(Qt::WA_TranslucentBackground);
    m_lbMv->setMovie(m_mvGifLoadding);
    QHBoxLayout* hblLb = new QHBoxLayout;
    hblLb->addStretch();
    hblLb->addWidget(m_lbMv);
    hblLb->addStretch();
    vblMain->addLayout(hblLb);
}

void CLoaddingPanel2::showEvent(QShowEvent *event)
{
    m_mvGifLoadding->start();
}

void CLoaddingPanel2::hideEvent(QHideEvent *event)
{
    m_mvGifLoadding->stop();
}

void CLoaddingPanel2::paintEvent(QPaintEvent *event)
{
    QPainter penter(this);
    QRect lbRct(m_lbMv->pos(), m_lbMv->size());

    QRegion rg1(0, 0, width(), lbRct.y());
   QRegion rg2(0, lbRct.bottom() + 1, width(), height() - lbRct.bottom() - 1);
    QRegion rg3(0, lbRct.y(), lbRct.x() , lbRct.height());
    QRegion rg4(lbRct.right() + 1, lbRct.y(), width() - lbRct.left() - 1, lbRct.height());
    
    QPainterPath path;
    path.addRegion(rg1);
    path.addRegion(rg2);
    path.addRegion(rg3);
    path.addRegion(rg4);
    penter.fillPath(path, QColor(255, 255, 255 , 255 / 2));
}

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值