裁切图片可以用来设置指定裁切的区域形状,然后在把图片绘制到裁切的pix上,这样目标pix就会只显示裁切出来的区域的内容。
裁切的过程也是一个重新绘制的过程,步骤如下:
使用QPixmap加载源图片的信息src;
根据获取源图片的信息src之后,创建目标pix,用于裁切形状和后续绘制内容,并设置pix.fill(Qt::transparent)背景透明(不设置透明的话,裁切区域的其他部分会显示为黑色背景);
在目标pix上,使用QPainterPath 绘制裁切的区域,可以添加形状如矩形,圆形椭圆等,裁切同时指定裁切区域的原点,半径,宽高等;
在目标pix上,使用QPainter:: setClipPath把QPainterPath绘制的裁切区域设置到目标pix上;
在目标pix上,绘制内容,内容为源图片数据;
在目标label上,通过label->setPixmap(pix);把绘制的目标pix添加到label上显示;
如果需要最终设定label的大小缩放,再lebel->resize即可
Qt代码例子如下:
QPixmap src(":/icons/panda2.jpeg"); //加载源图片
QPixmap pix(src.width(), src.height()); //创建一个新的pixmap作为painter的绘图设备
qDebug()<<src.width()<<src.height();
pix.fill(Qt::transparent); //设置图片透明
QPainter painter(&pix); //在创建的新的pix上进行绘制
painter.setRenderHints(QPainter::Antialiasing|QPainter::SmoothPixmapTransform); //抗锯齿效果
//设置裁切区域
QPainterPath path;
//设置圆形半径,取源图片宽度和高度中,较大者的一半作为裁切半径
int radius = src.height()<src.width() ? src.height()/2:src.width()/2;
path.addEllipse(src.rect().center(), radius,radius); //绘制裁切区域的大小
painter.setClipPath(path); //设置裁切区域,设置后,图片只显示设定的裁切区域内容
//把源图片的内容绘制到创建的pix上,非裁切区域的内容将不显示
painter.drawPixmap(pix.rect(), src);
//按照指定的大小缩放图片
ui->labelAvatar->setFixedSize(100,100);
ui->labelAvatar->setScaledContents(true);
ui->labelAvatar->setPixmap(pix);
效果如下:
这是制作的一个模仿QQ登录界面的主窗口,效果如下: