天天看點

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 加載圓形圖檔

喜歡我的部落格可以關注,點贊,讓我們越來越好。

繼續閱讀