每天自定义一些qt 控件,让自己学到更多的东西,我们经常看到一些圆形的账号图片,我们知道常用QLabel加载图片,但是加载的都是方形的,而且qt并不像html 那样改变特别方便。
我们常见的图像如:
还有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);
效果图:
喜欢我的博客可以关注,点赞,让我们越来越好。