最近项目中需要在QWidget中将直角矩形图片以圆角的方式呈现出来,找了很多方法,终于这位老哥的方法可以实现https://blog.csdn.net/qq_36651243/article/details/106388069
以下是效果图:
#include "form.h"
#include "ui_form.h"
#include <QHBoxLayout>
#include <QPainter>
#include <QDebug>
#include <QPushButton>
QPixmap getRoundRectPixmap(QPixmap srcPixMap, const QSize & size, int radius)
{
//不处理空数据或者错误数据
if (srcPixMap.isNull()) {
return srcPixMap;
}
//获取图片尺寸
int imageWidth = size.width();
int imageHeight = size.height();
//处理大尺寸的图片,保证图片显示区域完整
QPixmap newPixMap = srcPixMap.scaled(imageWidth, (imageHeight == 0 ? imageWidth : imageHeight),Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
QPixmap destImage(imageWidth, imageHeight);
destImage.fill(Qt::transparent);
QPainter painter(&destImage);
// 抗锯齿
painter.setRenderHints(QPainter::Antialiasing, true);
// 图片平滑处理
painter.setRenderHints(QPainter::SmoothPixmapTransform, true);
// 将图片裁剪为圆角
QPainterPath path;
QRect rect(0, 0, imageWidth, imageHeight);
path.addRoundedRect(rect, radius, radius);
painter.setClipPath(path);
painter.drawPixmap(0, 0, imageWidth, imageHeight, newPixMap);
return destImage;
}
Form::Form(QWidget *parent) :
QWidget(parent),
ui(new Ui::Form)
{
ui->setupUi(this);
setWindowFlag(Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground);
m_pixmap.load(":/img/download.png");
m_pixmap = getRoundRectPixmap(m_pixmap,QSize(400,400),20);
}
Form::~Form()
{
delete ui;
}
void Form::paintEvent(QPaintEvent *event)
{
if(m_pixmap.isNull()){
return;
}
QPainter painter(this);
painter.drawPixmap(m_pixmap.rect(),m_pixmap);
}