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

标签 c++ qt qt5 qpainter qmouseevent

我是 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 );
    }
}

关于c++ - 如何在 Qt 5 的 paintEvent 上使用 mouseMoveEvent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45248410/

相关文章:

c++ - setHeaderData 不工作 + qt

Qt5 双范围 slider

c++ - 如何增加 Visual Studio 中的错误限制?

c++ - OpenCL - 内核方法返回意外结果

c++ - 如何在 while 循环中使用 pow() ?

C++ - 如何在应用程序运行期间添加类对象

Qt qApp setFont()

mysql - QSqlQuery 仅返回两列 SELECT * FROM ...,知道为什么我没有得到所有列吗?

c++ - 将项目小部件宽度(列表内容)调整为父 QListWidget 宽度

qt - PyQt 信号 : will a fired signal still do its job after a disconnect()?