【问题标题】:How to use mouseMoveEvent on paintEvent on Qt 5?如何在 Qt 5 中的paintEvent 上使用 mouseMoveEvent?
【发布时间】:2017-07-22 00:15:56
【问题描述】:

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

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

你能帮帮我吗?

问候,

加布里埃尔。

【问题讨论】:

    标签: c++ qt qt5 qpainter qmouseevent


    【解决方案1】:

    根据doc

    位置:QPoint

    此属性保存小部件在其父级中的位置 小部件。

    如果小部件是窗口,则位置是小部件在 桌面,包括它的框架。

    ...

    访问功能:

    QPoint pos() const void

    移动(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 );
        }
    }
    

    【讨论】:

    • 你好@eyllanesc。我正在尝试从 pyqt 迁移到 qt。您的解决方案再次帮助了我。非常感谢。
    • 我正在阅读一些 c++ 教程,这门语言对我来说是新的,但我很喜欢。在继续构建我的 ui 之前,我将阅读 Qt 的文档。感谢您的提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    相关资源
    最近更新 更多