Qt绘图中透明橡皮

void Eraser::eraserRect(QRectF& rect, QImage* image)
{
    for (int i=rect.x(); i<rect.x()+rect.width(); ++i)
{
for (int j=rect.y(); j<rect.y()+rect.height(); ++j)
{
image->setPixel(i, j, 0);
}
}
}

自定义一个橡皮,qt中自带的那个是eraseRect();什么的,画出来是一个白色的线,虽然擦除了,也覆盖了背景。

这个方法,定义一个image作为蒙板,然后调用写的mouseEvent事件处理就搞定


### 使用Qt实现绘图软件的铅笔和橡皮功能 #### 铅笔功能实现 为了在Qt中实现铅笔功能,通常会在自定义的小部件(如`QWidget`派生类)内处理鼠标事件。每当检测到鼠标的移动并伴随有按键按下时,则认为用户正在绘制线条。 ```cpp void DrawingWidget::mouseMoveEvent(QMouseEvent *event) { if (drawing && tool == Tool_Pencil) { QPainter painter(&image); QPen pen(drawColor, drawWidth, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); painter.setPen(pen); // Draw a line from the last point to this new one. painter.drawLine(lastPoint, event->pos()); int rad = (drawWidth / 2) + 2; update(QRect(lastPoint, event->pos()).normalized().adjusted(-rad, -rad, +rad, +rad)); lastPoint = event->pos(); } } ``` 上述代码片段展示了如何监听鼠标移动事件,并使用`QPainter`对象在内部存储的图片(`QImage`)上绘制线条[^1]。 #### 橡皮功能实现 对于橡皮功能而言,在相同类型的自定义组件里同样捕获鼠标动作,不过此时不是增加新的像素而是移除它们——即覆盖原有颜色或恢复背景色。这可以通过调整画刷的颜色为背景色完成: ```cpp void DrawingWidget::mouseMoveEvent(QMouseEvent *event) { if (drawing && tool == Tool_Eraser) { QPainter painter(&image); QColor eraserColor = backgroundColor; // Assuming you have defined background color somewhere QPen pen(eraserColor, eraseWidth, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); painter.setPen(pen); painter.drawLine(lastPoint, event->pos()); int rad = (eraseWidth / 2) + 2; update(QRect(lastPoint, event->pos()).normalized().adjusted(-rad, -rad, +rad, +rad)); lastPoint = event->pos(); } } ``` 这里的关键在于切换使用的工具变量(例如`tool`),以便区分何时应用铅笔逻辑而何时执行橡皮行为[^2]。 另外值得注意的是,实际项目可能还需要考虑更多细节,比如提供界面让用户选择不同的画笔尺寸、样式等特性;同时也要确保良好的用户体验,像即时预览效果等功能都是提升产品品质的重要因素之一[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值