在做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));
}