qt eventFilter和mousePressEvent里event.pos区别

[复制链接]
发表于 2025-9-23 05:47:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
mousePressEvent 和  eventFilter 里 event.pos 不一样,肯定要注意
eventFilter里event.pos 直接返回相对于Watched对象左上角的坐标
mousePressEvent 里event.pos 返回是相对于所处组件的左上角的坐标

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. QT_BEGIN_NAMESPACE
  5. namespace Ui { class MainWindow; }
  6. QT_END_NAMESPACE
  7. class MainWindow : public QMainWindow
  8. {
  9.     Q_OBJECT
  10. public:
  11.     MainWindow(QWidget *parent = nullptr);
  12.     ~MainWindow();
  13.     bool eventFilter(QObject* watched, QEvent* event) override;
  14.         void mousePressEvent(QMouseEvent* event) override;
  15. private:
  16.     Ui::MainWindow *ui;
  17.     void onMouse(QMouseEvent* event);
  18. };
  19. #endif // MAINWINDOW_H
复制代码
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QEvent>
  4. #include <QMouseEvent>
  5. #include <QDebug>
  6. MainWindow::MainWindow(QWidget *parent)
  7.     : QMainWindow(parent)
  8.     , ui(new Ui::MainWindow)
  9. {
  10.     ui->setupUi(this);
  11.     ui->label->setAttribute(Qt::WA_Hover);  // 确保 QLabel 能接收到鼠标移动事件
  12.     ui->label->setMouseTracking(true); //鼠标移入label上移动就会触发MouseMove,去掉这行后,只有鼠标按下且移动才会触发
  13.     ui->label->installEventFilter(this);
  14. }
  15. MainWindow::~MainWindow()
  16. {
  17.     delete ui;
  18. }
  19. // 添加事件过滤器处理鼠标事件
  20. bool MainWindow::eventFilter(QObject* watched, QEvent* event)
  21. {
  22.    
  23.     if (watched == ui->label) {
  24.         if (event->type() == QEvent::MouseMove) {
  25.             QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
  26.             onMouse(mouseEvent);
  27.             return true;
  28.         }
  29.         
  30.         else if (event->type() == QEvent::Leave) {
  31.             //qDebug()<<"li kai l";
  32.         }
  33.     }
  34.     return QMainWindow::eventFilter(watched, event);
  35. }
  36. void MainWindow::onMouse(QMouseEvent* event)
  37. {
  38.     // 将QLabel的坐标转换为图像坐标
  39.     QPoint pos = ui->label->mapFrom(this, event->pos());  //eventFilter里不要用mapFrom,因为event.pos直接返回的就是相对于label左上角的
  40.     qDebug()<<"onMouse event->pos() :"<<event->pos(); //直接返回相对于label左上角坐标
  41.     qDebug()<<"onMouse mapFrom pos :"<<pos;
  42. }
  43. void MainWindow::mousePressEvent(QMouseEvent* event) {
  44.     qDebug() << "mousePressEvent  event->pos :"<<event->pos(); //相对于窗口的左上角
  45.    
  46.     QPoint pos = ui->label->mapFrom(this, event->pos());
  47.     qDebug() << "mousePressEvent mapFrom pos :"<<pos;//mapFrom将窗口左上角坐标转为相对于label左上角
  48.     qDebug() << "mousePressEvent event->globalpos :"<<event->globalPos(); //显示屏窗口左上角
  49.    
  50. }
复制代码

globalPos是相对于 体现屏屏幕左上角的位置 ,注意是相对于体现屏屏幕

末了发现  
mousePressEvent 和  eventFilter 里 event.pos 不一样,肯定要注意
event.pos 在eventFilter里 直接返回相对于label左上角的坐标,就不要再mapFrom


FR:徐海涛(hunkxu)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表