如何在 Qt 5 的 paintEvent 上使用 mouseMoveEvent?

How to use mouseMoveEvent on paintEvent on Qt 5?

我是 Qt 和 c++ 的新手,所以我遇到了一些困难。我正在尝试创建一个小部件,它可以获取 mouseMoveEvent 位置并在鼠标位置的像素图上绘制一个椭圆。下面你可以看到代码:

#include "myimage.h"
#include <QPainter>
#include <QPen>
#include <QColor>
#include <QMouseEvent>
#include <QDebug>

Myimage::Myimage(QWidget *parent) : QWidget(parent)
{
    setMouseTracking(true); // E.g. set in your constructor of your widget.
}



// Implement in your widget
void Myimage::mouseMoveEvent(QMouseEvent *event)
{
    qDebug() << event->pos();

}

void Myimage::paintEvent(QPaintEvent * event)
{
    event->accept();
    QPixmap pixmap2("/home/gabriel/Qt_interfaces/OpenCVTests/Webcam_PyQt5/Images/Court_top_View.jpg");

    QRect rectangle(0, 0, width()-1, height()-1);

    QPainter painter(this);
    painter.drawRect(rectangle);
    painter.drawPixmap(5, 5, width()-10, height()-10, pixmap2);


    painter.drawEllipse(pos(), 10 ,10 );
}

鼠标位置打印在控制台上,但图像上没有椭圆。

你能帮帮我吗?

此致,

加百列

根据 doc:

pos : QPoint

This property holds the position of the widget within its parent widget.

If the widget is a window, the position is that of the widget on the desktop, including its frame.

...

Access functions:

QPoint pos() const void

move(int x, int y)

void move(const QPoint &)

当我们看到这个数据时,我们并不想要它,一个可能的解决方案是创建一个变量来存储通过 QMouseEvent 获得的位置值,并通过函数 update() 更新绘画, 另外 Widget 第一次应该没有椭圆所以我们通过 QPoint 的函数 isNull() 检查位置是否已分配,如下所示:

*.h

private:
    QPoint mPoint;

*.cpp

Myimage::Myimage(QWidget *parent)
    : QWidget(parent)
{
    setMouseTracking(true);
}

void Myimage::mouseMoveEvent(QMouseEvent *event)
{
    mPoint = event->pos();
    update();
}

void Myimage::paintEvent(QPaintEvent *)
{
    QPixmap pixmap2("/home/gabriel/Qt_interfaces/OpenCVTests/Webcam_PyQt5/Images/Court_top_View.jpg");

    QRect rectangle(0, 0, width()-1, height()-1);

    QPainter painter(this);
    painter.drawRect(rectangle);
    painter.drawPixmap(5, 5, width()-10, height()-10, pixmap2);

    if(!mPoint.isNull()){

        painter.drawEllipse(mPoint, 10 ,10 );
    }
}