qt mapFrom返回的QPoint和event->pos()区别和globalPos区别

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)

相关推荐
知无不研30 分钟前
lambda表达式的使用(3)
开发语言·c++·lambda
cfm_29141 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
C++ 老炮儿的技术栈2 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐
qq_448011162 小时前
C语言中的柔性数组
c语言·开发语言·柔性数组
小白学大数据2 小时前
长周期爬虫的数据一致性:断点续爬 + 事务回滚保障采集质量
开发语言·爬虫·测试工具
zlinear数据采集卡3 小时前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
Poo_Chai3 小时前
QT emit信号后完整处理流程,包括槽函数响应流程
java·开发语言·数据库
瑞码空间3 小时前
Java 图形界面(GUI)完整知识点手册
java·开发语言·图形界面·swing
小努蛋4 小时前
linux编译openresty异常问题,lua_cjson.c:706:5: 错误: ‘for‘ 循环初始化声明只在 C99 或 C++ 模式下允许
开发语言·lua·openresty
qz_Serene4 小时前
C++:类和对象(上)
开发语言·c++