每天自定義一些qt 控件,讓自己學到更多的東西,我們經常看到一些圓形的賬号圖檔,我們知道常用QLabel加載圖檔,但是加載的都是方形的,而且qt并不像html 那樣改變特别友善。
我們常見的圖像如:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL2kzNwUTOzYTM2IzMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
還有csdn的使用者的:
都是這種圓形圖檔,想要需要我們重新定義控件,自己來畫,才會出結果。
然後我們就從新定義一個類,來繼承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);
效果圖:
喜歡我的部落格可以關注,點贊,讓我們越來越好。