Qt关于mouseMoveEvent的捕捉以及setMouseTracking

11 篇文章 0 订阅

一、对于单个Widget而言,要想在鼠标不按下的情况下捕捉mouseMoveEvent,则对该widget执行:

setMouseTracking(true);

二、对于父子窗口而言,父窗口若想捕捉到鼠标在子窗口上方的mouseMoveEvent,则父子窗口都需要执行:

setMouseTracking(true);

并且子窗口并未对该事件进行处理,即没有accept或ignore该事件。子窗口若重载了mouseMoveEvent,则父窗口捕捉不到子窗口的mouseMoveEvent。

三、QMainWindow的mouseMoveEvent.QMainWindow有一个子部件centralWidget,因此想要捕捉mouseMoveEvent,QMainWindow以及centralWidget均要执行:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->centralWidget()->setMouseTracking(true);
    this->setMouseTracking(true);
}

四、对于Qt::Popup的窗口。之前研究QMenu,发现菜单弹出后,即使鼠标已经离开菜单范围,在父窗口范围内移动时,菜单仍能捕捉到mouseMoveEvent,于是做了个实验,子类化一个QWidget,并且设置为Qt::Popup。

Qmydialog.h:

#ifndef QMYDIALOG_H
#define QMYDIALOG_H

#include <QDialog>
#include "qpopupwidget.h"

namespace Ui {
class QMyDialog;
}

class QMyDialog : public QDialog
{
    Q_OBJECT

public:
    explicit QMyDialog(QWidget *parent = 0);
    ~QMyDialog();

private:
    Ui::QMyDialog *ui;

    QPopUpWidget *popwidget;

public:
    void mouseMoveEvent(QMouseEvent *event);
    bool eventFilter(QObject *watched, QEvent *event);
private slots:
    void on_pushButton_clicked();
};

#endif // QMYDIALOG_H

Qmydialog.cpp:

#include "qmydialog.h"
#include "ui_qmydialog.h"

#include <QDebug>
#include <QMouseEvent>

QMyDialog::QMyDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::QMyDialog)
{
    ui->setupUi(this);
    popwidget = new QPopUpWidget(this);
    popwidget->setWindowFlags(Qt::Popup);
    popwidget->setMouseTracking(true);
    popwidget->installEventFilter(this);

    setMouseTracking(true);

}

QMyDialog::~QMyDialog()
{
    delete ui;
}


void QMyDialog::mouseMoveEvent(QMouseEvent *event)
{

    qDebug() <<__FUNCTION__ <<event->localPos();
}

bool QMyDialog::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == popwidget)
    {
        if(event->type() == QEvent::MouseMove)
        {
             qDebug() << "popwidget mouse move"<<((QMouseEvent*)event)->localPos();
        }
    }
    return false;
}

void QMyDialog::on_pushButton_clicked()
{
    if(popwidget->isVisible())
        popwidget->hide();
    else
    {
        QRect rc = ui->pushButton->geometry();
        QPoint pt = mapToGlobal(rc.bottomRight());
        popwidget->move(pt);
        popwidget->show();
    }
}

其中的Qpopupwidget是子类化的QWidget:

Qpopupwidget.h:

#ifndef QPOPUPWIDGET_H
#define QPOPUPWIDGET_H

#include <QWidget>

namespace Ui {
class QPopUpWidget;
}

class QPopUpWidget : public QWidget
{
    Q_OBJECT

public:
    explicit QPopUpWidget(QWidget *parent = 0);
    ~QPopUpWidget();

private:
    Ui::QPopUpWidget *ui;
};

#endif // QPOPUPWIDGET_H

Qpopupwidget.cpp:

#include "qpopupwidget.h"
#include "ui_qpopupwidget.h"

QPopUpWidget::QPopUpWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::QPopUpWidget)
{
    ui->setupUi(this);
}

QPopUpWidget::~QPopUpWidget()
{
    delete ui;
}

运行后从打印出来的调试信息可以发现,点击dialog上的按钮后,弹出Qpopupwidget,在dialog上移动鼠标或者在Qpopupwidget上移动鼠标,均会触发QPopupWidget的mouseMoveEvent.

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值