天天看点

QT 自定义圆形QLabel 加载圆形图片

     每天自定义一些qt 控件,让自己学到更多的东西,我们经常看到一些圆形的账号图片,我们知道常用QLabel加载图片,但是加载的都是方形的,而且qt并不像html 那样改变特别方便。

我们常见的图像如:

QT 自定义圆形QLabel 加载圆形图片

还有csdn的用户的:

QT 自定义圆形QLabel 加载圆形图片

都是这种圆形图片,想要需要我们重新定义控件,自己来画,才会出结果。

然后我们就从新定义一个类,来继承QLable 或者继承 QFrame :

这里提示一下,我定义类的时候把MyLabel 拼写错了,写成了MyLable 。大家自己写的时候演注意一下。

代码如下 :

#ifndef MYLABLE_H
#define MYLABLE_H

#include <QObject>
#include<QLabel>
class MyLable :public QLabel
{
    Q_OBJECT
public:
    MyLable(QWidget* parent = nullptr);
signals:
    void signClick();
protected:
    void paintEvent(QPaintEvent *e);
    void mousePressEvent(QMouseEvent *ev);
    void mouseMoveEvent(QMouseEvent *ev);
    void mouseReleaseEvent(QMouseEvent *ev);

private:
    bool m_set;//透明度的
    QPixmap oldMap;
};

#endif // MYLABLE_H
           

cpp 代码:

#include "mylable.h"
#include <QPainter>
MyLable::MyLable(QWidget* parent):QLabel (parent)
{
   m_set = false;

}

void MyLable::paintEvent(QPaintEvent *e)
{
    if(nullptr != pixmap())
    {
        QPainter painter(this);
        //设置反锯齿
        painter.setRenderHints(QPainter::Antialiasing |
                               QPainter::SmoothPixmapTransform);
        QPainterPath path;
        int round = qMin(width(),height());
        path.addEllipse(0,0,round,round);
        painter.setClipPath(path);
        oldMap = *pixmap(); //获取原来的
        if(m_set)
        {
            QPixmap pixMap(":/images/images/2.jpg");
            painter.drawPixmap(-1,-1,width()+10,height()+10,pixMap);
        }
        else {
            painter.drawPixmap(-1,-1,width()+10,height()+10,oldMap);
        }


    }
    else {
        QLabel::paintEvent(e);
    }
}

void MyLable::mousePressEvent(QMouseEvent *ev)
{
     m_set = true;
     update();
     QLabel::mousePressEvent(ev);
}

void MyLable::mouseMoveEvent(QMouseEvent *ev)
{
    m_set = false;
    update();
    QLabel::mouseMoveEvent(ev);
}

void MyLable::mouseReleaseEvent(QMouseEvent *ev)
{
    m_set = false;
    update();
    emit signClick();
    QLabel::mouseReleaseEvent(ev);
}
           

 使用的方法:

mylabel = new MyLable(this);
    QPixmap pixmap(":/images/images/1.jpg");
    mylabel->setPixmap(pixmap);
    mylabel->setGeometry(0,0,100,100);

    ui->layoutpicture->addWidget(mylabel);
           

效果图:

QT 自定义圆形QLabel 加载圆形图片

喜欢我的博客可以关注,点赞,让我们越来越好。

继续阅读