mousePressEvent 和 eventFilter 里 event.pos 不一样,一定要注意
eventFilter里event.pos 直接返回相对于label左上角的坐标,就不要再mapFrom
mousePressEvent 里event.pos 返回是相对于窗口左上角的坐标,需要用mapFrom返回label左上角的坐标
event->pos() : 以图片的左上角为中心(0,0),右下角:(图片宽度,图片高度)
mapFrom : 相当于 ( -x'+event->pos().x,-y'+event->pos().y ) ,其中 x' 和 y ' 值请看下图



#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
bool eventFilter(QObject* watched, QEvent* event) override;
void mousePressEvent(QMouseEvent* event) override;
private:
Ui::MainWindow *ui;
void onMouse(QMouseEvent* event);
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QEvent>
#include <QMouseEvent>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->label->setAttribute(Qt::WA_Hover); // 确保 QLabel 能接收到鼠标移动事件
ui->label->setMouseTracking(true); //鼠标移入label上移动就会触发MouseMove,去掉这行后,只有鼠标按下且移动才会触发
ui->label->installEventFilter(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
// 添加事件过滤器处理鼠标事件
bool MainWindow::eventFilter(QObject* watched, QEvent* event)
{
if (watched == ui->label) {
if (event->type() == QEvent::MouseMove) {
QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
onMouse(mouseEvent);
return true;
}
else if (event->type() == QEvent::Leave) {
//qDebug()<<"li kai l";
}
}
return QMainWindow::eventFilter(watched, event);
}
void MainWindow::onMouse(QMouseEvent* event)
{
// 将QLabel的坐标转换为图像坐标
QPoint pos = ui->label->mapFrom(this, event->pos()); //eventFilter里不要用mapFrom,因为event.pos直接返回的就是相对于label左上角的
qDebug()<<"onMouse event->pos() :"<<event->pos(); //直接返回相对于label左上角坐标
qDebug()<<"onMouse mapFrom pos :"<<pos;
}
void MainWindow::mousePressEvent(QMouseEvent* event) {
qDebug() << "mousePressEvent event->pos :"<<event->pos(); //相对于窗口的左上角
QPoint pos = ui->label->mapFrom(this, event->pos());
qDebug() << "mousePressEvent mapFrom pos :"<<pos;//mapFrom将窗口左上角坐标转为相对于label左上角
qDebug() << "mousePressEvent event->globalpos :"<<event->globalPos(); //显示屏窗口左上角
}
globalPos是相对于 显示屏屏幕左上角的位置 ,注意是相对于显示屏屏幕
最后发现
mousePressEvent 和 eventFilter 里 event.pos 不一样,一定要注意
event.pos 在eventFilter里 直接返回相对于label左上角的坐标,就不要再mapFrom
FR:徐海涛(hunkxu)