使用qt5.12.9的qml开发框架下,用QPainter绘图开发一个白板应用发现了一个问题:
图案绘制完成后,想要擦除一部分已经绘制的图像,想使用eraseRect函数将绘制的图案擦除。但是背景色为一张图片,绘制图像的层就是透明色,这样可以保证绘制的图像和背景不被冲突。但是你再调用eraseRect函数对已经绘制的图案做擦除操作,会覆盖之前的图案并留下白色的填充,无法用透明色覆盖填充。
解决:
// point.model true:绘制红色的路径 false:清除红色的路径
if(point.model){
painter->setCompositionMode(QPainter::CompositionMode_SourceOver);
painter->fillRect(point.x - (point.width/2), point.y - (point.width/2),
point.width, point.width, QColor(255,0,0,255));
}
else {
painter->setCompositionMode(QPainter::CompositionMode_Clear);
painter->eraseRect(point.x - (point.width/2), point.y -(point.width/2),
point.width, point.width);
}
设置QPainter的绘图模式,默认的绘图模式是运用使用透明度分量来绘制图案的,在清除的时候直接设置绘图模式为清除,后面绘制的绘制操作直接清除像素信息实现,清除之前的绘画内容并不遮挡背景图像的显示。