在C++ Qt中,可以通过设置QPainter的CompositionMode来实现橡皮擦功能。具体来说,我们可以将绘制模式设置为QPainter::CompositionMode_Clear,然后使用指定大小和形状的笔刷在画布上绘制,就能够清除指定区域的图像。
下面是一个简单的示例代码:
void DrawingWidget::erase(QPoint pos, int size)
{
QPainter painter(&image);
painter.setCompositionMode(QPainter::CompositionMode_Clear);
QBrush brush(Qt::black, Qt::SolidPattern);
painter.setBrush(brush);
QRect rect(pos.x() - size/2, pos.y() - size/2, size, size);
painter.drawRect(rect);
update();
}
在这个示例中,我们定义了一个名为erase()的函数,用于擦除画布上指定位置和大小的图像。首先,我们创建了一个QPainter对象,并将其绘制模式设置为CompositionMode_Clear。接着,我们创建了一个黑色填充、样式为实线的QBrush对象,并将其设置为当前画刷。最后,使用drawRect()函数绘制指定大小和位置的矩形,在画布上进行清除操作。
在使用该函数时,您只需要传入鼠标点击或移动事件捕获到的位置信息以及需要擦除区域的大小即可。例如,在mouseMoveEvent()函数中调用erase()函数可以这样写:
void DrawingWidget::mouseMoveEvent(QMouseEvent *event)
{
if ((event->buttons() & Qt::LeftButton) && isDrawing) {
if (event->modifiers() & Qt::ControlModifier) {
erase(event->pos(), 20);
} else {
QPainter painter(&image);
QPen pen(Qt::black, 10, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.setPen(pen);
QPoint currentPos = event->pos();
painter.drawLine(lastPoint, currentPos);
lastPoint = currentPos;
update();
}
}
}
在这个示例中,我们首先判断是否按下了Ctrl键。如果是,则调用erase()函数进行橡皮擦操作;否则,使用QPainter类实现笔刷功能并绘制线条。