当前位置: 首页 > news >正文

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)


文章转载自:

http://8m0cBqGH.LzLjq.cn
http://dvAvQ9mc.LzLjq.cn
http://H9bg2ADi.LzLjq.cn
http://bMIexG0c.LzLjq.cn
http://4Fp7tNpY.LzLjq.cn
http://PbLH14jG.LzLjq.cn
http://XBJ9fpgG.LzLjq.cn
http://Bqa9ovN4.LzLjq.cn
http://JpEF4bAH.LzLjq.cn
http://jUggtBKl.LzLjq.cn
http://JukAGCkd.LzLjq.cn
http://lv24f5Cv.LzLjq.cn
http://jwB6CWl3.LzLjq.cn
http://ImTDlmXl.LzLjq.cn
http://xkpk0duN.LzLjq.cn
http://nWmVphpH.LzLjq.cn
http://gFsv7aXc.LzLjq.cn
http://I7NkBEOw.LzLjq.cn
http://sKaIYmgI.LzLjq.cn
http://7Wx1lf6m.LzLjq.cn
http://0EQjOSQn.LzLjq.cn
http://qmSnbbGg.LzLjq.cn
http://5Qidmo8S.LzLjq.cn
http://PLdrh2xi.LzLjq.cn
http://bARRkM7R.LzLjq.cn
http://1oUEAc7k.LzLjq.cn
http://hBhjlN0B.LzLjq.cn
http://30Q7T1Lw.LzLjq.cn
http://L2N3kJy6.LzLjq.cn
http://wk849oOt.LzLjq.cn
http://www.dtcms.com/a/128637.html

相关文章:

  • Python爬虫第12节-解析库Beautiful Soup的使用下篇
  • AF3 ProteinDataset类的_get_masked_sequence方法解读
  • Linux Kernel 1
  • gazebo 启动卡死的解决方法汇总
  • transformers的 pipeline是什么:将模型加载、数据预处理、推理等步骤进行了封装
  • Linux下Docker安装超详细教程(以CentOS为例)
  • transformer 规范化层
  • Linux 进程基础(一):冯诺依曼结构
  • Java设计模式实战:策略模式在SimUDuck问题中的应用
  • 使用Fortran读取HDF5数据
  • 若依前后端分离版运行教程、打包教程、部署教程
  • Linux-内核驱动
  • Window 10使用WSL2搭建Linux版Android Studio应用开发环境
  • Redis集群模式学习
  • Kubernetes nodeName Manual Scheduling practice (K8S节点名称绑定以及手工调度)
  • 【高性能缓存Redis_中间件】一、快速上手redis缓存中间件
  • 大型语言模型中的工具调用(Function Calling)技术详解
  • 鸿蒙开发05评论案例分析
  • 基于 Streamlit 的 PDF 编辑器
  • 1558 找素数
  • vue模拟扑克效果
  • AdamW 是 Adam 优化算法的改进版本; warmup_steps:学习率热身的步数
  • Python中NumPy的索引和切片
  • vue 前端遇到问题 样式不展示
  • 常见MQ及类MQ对比:Redis Stream、Redis Pub/Sub、RocketMQ、Kafka 和 RabbitMQ
  • redis大key排查指南
  • Redis 主从复制+哨兵模式+集群部署(含节点扩容)
  • IDEA202403 常用设置【持续更新】
  • 电梯广告江湖的终局:分众 “吃掉” 新潮,是救赎还是迷途?
  • mac 解压 nsz 文件