一、对于单个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.