Подкласс QLabel
и поместите логику в него вместо использования фильтра событий. Это будет легче сделать и поддерживать:
class DrawLabel: public QLabel
{
Q_OBJECT
public:
DrawLabel(QWidget* parent=nullptr): QLabel(parent)
{
setMouseTracking(true);
}
void setPixmap(QPixmap const& pixmap)
{
QLabel::setPixmap(pixmap);
setFixedSize(pixmap.size());
}
virtual void mousePressEvent(QMouseEvent* event) override
{
if (event->button() != Qt::LeftButton)
{
start = QPointF();
end = QPointF();
}
if (start.isNull() || !end.isNull())
{
start = event->pos();
end = QPointF();
}
else
{
end = event->pos();
update();
}
qDebug() << Q_FUNC_INFO << start << end;
}
virtual void paintEvent(QPaintEvent* event) override
{
QLabel::paintEvent(event);
if (start.isNull() || end.isNull())
return;
QPainter painter(this);
painter.drawLine(start, end);
}
void mouseMoveEvent(QMouseEvent* event)
{
positionChanged(event->pos());
}
signals:
void positionChanged(QPoint const&);
private:
QPointF start, end;
};
Для испытаний:
QPixmap pix(QSize(40, 40));
pix.fill(Qt::blue);
QWidget* w = new QWidget;
QVBoxLayout* layout = new QVBoxLayout(w);
DrawLabel* label = new DrawLabel();
label->setPixmap(pix);
QLabel* position = new QLabel("");
layout->addWidget(label);
layout->addWidget(position);
QObject::connect(label, &DrawLabel::positionChanged, [=](QPoint const& p) {position->setText(QString("Position: %0 ; %1").arg(p.x()).arg(p.y()));});
w->show();
Если вы абсолютно хотите использовать фильтр событий, обновите растровое изображение, нарисовав на нем линию. Вам просто нужно сохранить оригинальную версию вашего растрового изображения:
bool MainWindow::eventFilter(QObject *object, QEvent *event)
{
if(object != label)
return false;
if (event->type() == QEvent::MouseMove) {
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
mouseMoveEvent(mouseEvent);
} else if (event->type() == QEvent::MouseButtonPress)
{
QMouseEvent* mouseEvent = static_cast<QMouseEvent *>(event);
if (mouseEvent->button() == Qt::LeftButton)
{
(firstClick ? start : end) = mouseEvent->pos();
qDebug() << Q_FUNC_INFO << start << end << firstClick;
if (!firstClick)
drawLine();
firstClick = !firstClick;
}
}
return false;
}
void MainWindow::drawLine()
{
QPixmap pix(origin);
QPainter painter(&pix);
painter.drawLine(start, end); // The event contains positions it the label coor sys. No need to map them
label->setPixmap(pix);
}