簡體   English   中英

如何在 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 );
}

鼠標位置正在控制台上打印,但圖像上沒有橢圓。

你可以幫幫我嗎?

問候,

加布里埃爾。

根據文檔

位置 : QPoint

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

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

...

訪問功能:

QPoint pos() const void

移動(int x,int y)

無效移動(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 );
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM