qpainter 绘制白板画笔擦除等功能

### 在Qt6中使用C++QPainter实现绘制与橡皮擦功能 以下是一个完整的解决方案,展示如何在Qt6中通过`QPainter`实现绘制和橡皮擦功能。 #### 1. 创建绘图窗口 首先,创建一个继承自`QWidget`的类,用于处理绘图和橡皮擦逻辑。 ```cpp #include <QWidget> #include <QPainter> #include <QMouseEvent> #include <QPoint> class DrawingWidget : public QWidget { Q_OBJECT public: DrawingWidget(QWidget *parent = nullptr) : QWidget(parent), drawing(false), eraserMode(false) {} protected: void paintEvent(QPaintEvent *event) override { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); if (!paths.isEmpty()) { for (const QPainterPath &path : paths) { painter.drawPath(path); } } if (drawing && !currentPath.isEmpty()) { painter.drawPath(currentPath); } } void mousePressEvent(QMouseEvent *event) override { if (event->button() == Qt::LeftButton) { drawing = true; lastPoint = event->position().toPoint(); currentPath.moveTo(lastPoint); } } void mouseMoveEvent(QMouseEvent *event) override { if (drawing) { QPoint currentPoint = event->position().toPoint(); if (eraserMode) { // 橡皮擦模式:绘制背景色覆盖 QPainterPath path; path.moveTo(lastPoint); path.lineTo(currentPoint); currentPath = path; update(); } else { // 绘制模式:添加路径 currentPath.lineTo(currentPoint); update(); } lastPoint = currentPoint; } } void mouseReleaseEvent(QMouseEvent *event) override { if (event->button() == Qt::LeftButton) { drawing = false; if (!currentPath.isEmpty()) { paths.append(currentPath); currentPath.clear(); } } } void setEraserMode(bool mode) { eraserMode = mode; if (eraserMode) { QPen pen(Qt::white); // 假设背景为黑色,橡皮擦为白色 pen.setWidth(10); // 设置橡皮擦宽度 currentPath.setPen(pen); } } private: bool drawing; bool eraserMode; QVector<QPainterPath> paths; QPainterPath currentPath; QPoint lastPoint; }; ``` #### 2. 处理橡皮擦模式 在上述代码中,`setEraserMode()`函数用于切换到橡皮擦模式。当启用橡皮擦模式时,画笔颜色设置为背景色(例如白色),并调整画笔宽度以模拟橡皮擦效果[^1]。 #### 3. 主程序初始化 以下是一个简单的主程序示例,展示如何初始化`DrawingWidget`并提供橡皮擦切换按钮。 ```cpp #include <QApplication> #include <QVBoxLayout> #include <QPushButton> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; QVBoxLayout layout(&window); DrawingWidget drawingWidget; QPushButton toggleEraserButton("Toggle Eraser Mode"); layout.addWidget(&drawingWidget); layout.addWidget(&toggleEraserButton); QObject::connect(&toggleEraserButton, &QPushButton::clicked, [&]() { static bool eraserMode = false; eraserMode = !eraserMode; drawingWidget.setEraserMode(eraserMode); toggleEraserButton.setText(eraserMode ? "Drawing Mode" : "Eraser Mode"); }); window.resize(800, 600); window.show(); return app.exec(); } ``` #### 4. 关键点解析 - **橡皮擦模式**:通过设置画笔颜色为背景色,并调整画笔宽度来模拟橡皮擦效果。 - **路径管理**:使用`QPainterPath`存储绘制路径,确保每个绘制操作都能正确显示。 - **动态切换**:通过按钮或快捷键动态切换绘制模式和橡皮擦模式。 #### 注意事项 - 确保背景色与橡皮擦颜色一致,否则橡皮擦效果可能不明显。 - 如果需要支持多层绘图或复杂背景图像,可以考虑使用`QPixmap`或`QImage`保存每一层的内容[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值