我是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
  
  该属性保存小部件在其父级中的位置
  小部件。
  
  如果小部件是窗口,则位置是小部件在窗口上的位置。
  桌面,包括其框架。
  
  ...
  
  访问功能:
  
  QPoint pos()const无效
  
  移动(int x,int y)
  
  void move(const QPoint&)


正如我们看到的那样,我们不希望看到这些数据,一个可能的解决方案是创建一个变量,该变量存储通过QMouseEvent获取的位置的值,并通过函数update()更新绘画,此外,第一次在其中添加小部件应该不是椭圆形,因此我们检查位置是否已通过isNull()的功能QPoint分配,如下所示:

*。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 );
    }
}

10-08 09:33