马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
mousePressEvent 和 eventFilter 里 event.pos 不一样,肯定要注意
eventFilter里event.pos 直接返回相对于Watched对象左上角的坐标
mousePressEvent 里event.pos 返回是相对于所处组件的左上角的坐标
- #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)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|