下面是一个简单的示例代码,展示如何在Qt中实现橡皮擦功能,并且能够擦掉之前QPaint画笔绘画的内容:
#include <QtWidgets>
class Eraser : public QObject {
Q_OBJECT
public:
Eraser(QObject *parent = nullptr) : QObject(parent), m_rect(0, 0, 0, 0) {}
void setRect(const QRectF &rect) { m_rect = rect; }
QRectF rect() const { return m_rect; }
private:
QRectF m_rect;
};
class Canvas : public QWidget {
public:
Canvas(QWidget *parent = nullptr) : QWidget(parent), m_image(size(), QImage::Format_ARGB32_Premultiplied), m_pressed(false)
{
QPainter painter(&m_image);
painter.fillRect(rect(), Qt::white);
update();
}
protected:
void mousePressEvent(QMouseEvent *event) override
{
if (event->button() == Qt::LeftButton) {
m_eraser = new Eraser(this);
m_eraser->setRect(QRectF(event->pos(), QSize(50, 50)));
m_erasers.append(m_eraser);
m_pressed = true;
update();
}
}
void mouseMoveEvent(QMouseEvent *event) override
{
if (m_pressed) {
QRectF oldRect = m_eraser->rect();
QPointF delta = event->pos() - event->lastPos();
QPointF center = oldRect.center() + delta;
QRectF newRect(center - QSizeF(oldRect.size() / 2), oldRect.size());
newRect &= rect(); // Ensure the rectangle is inside the widget.
m_eraser->setRect(newRect);
update();
}
}
void mouseReleaseEvent(QMouseEvent *event) override
{
if (event->button() == Qt::LeftButton) {
m_pressed = false;
m_erasers.removeOne(m_eraser);
delete m_eraser;
QPainter painter(&m_image);
painter.setCompositionMode(QPainter::CompositionMode_DestinationOut);
for (const Eraser *eraser : qAsConst(m_erasers)) {
painter.eraseRect(eraser->rect());
}
update();
}
}
void paintEvent(QPaintEvent *event) override
{
QPainter painter(this);
// Draw the background image.
painter.drawImage(event->rect(), m_image, event->rect());
// Draw the erasers.
for (const Eraser *eraser : qAsConst(m_erasers)) {
QRectF rect = eraser->rect();
rect.translate(-offset());
painter.fillRect(rect, Qt::transparent);
}
}
private:
QImage m_image;
QList<Eraser *> m_erasers;
Eraser *m_eraser = nullptr;
bool m_pressed;
};
int main(int argc, char **argv)
{
QApplication app(argc, argv);
Canvas canvas;
canvas.resize(600, 400);
canvas.show();
return app.exec();
}
#include "main.moc"
这个示例代码实现了一个基本的绘图区域(Canvas)和橡皮擦类(Eraser),并在mousePressEvent()、mouseMoveEvent()和mouseReleaseEvent()三个事件函数中对应鼠标按下、移动和松开时的操作。其中,QImage对象m_image用于保存当前绘图区域的内容,QList
在paintEvent()事件函数中,先将m_image作为背景画出,然后遍历所有已经添加到绘图区域中的Eraser对象,使用QPainter::eraseRect()函数来删除对应的矩形区域。需要注意的是,在擦掉之前QPaint画笔绘画的内容时,需要将painter设置为CompositionMode_DestinationOut模式。
希望这个示例代码可以帮助你实现橡皮擦功能并能够擦掉之前QPaint画笔绘画的内容。