最近做了個測試發現Qt 的eventFilter無法過濾mouse事件,如mouseMove, mousePress, mouseRelease等,
原來是installEventFilter(QObject *)安裝不對。看Qt例子:
class MainWindow : public QMainWindow
{
public:
MainWindow();
protected:
bool eventFilter(QObject *obj, QEvent *ev);
private:
QTextEdit *textEdit;
};
MainWindow::MainWindow()
{
textEdit = new QTextEdit;
setCentralWidget(textEdit);
textEdit->installEventFilter(this);
}
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if (obj == textEdit) {
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
qDebug() << "Ate key press" << keyEvent->key();
return true;
} else {
return false;
}
} else {
// pass the event on to the parent class
return QMainWindow::eventFilter(obj, event);
}
}
這裏eventFilter接受的是QEvent::KeyPress事件,打印event->type發現始終獲得不到mouse事件,原來因爲QTextEdit是由QAbstractScollArea派生的,對於QAbstractScollArea,其過濾器要安裝在viewport上,
因此上面程序變換如下即可過濾mouse event:
class MainWindow : public QMainWindow
{
public:
MainWindow();
protected:
bool eventFilter(QObject *obj, QEvent *ev);
private:
QTextEdit *textEdit;
};
MainWindow::MainWindow()
{
textEdit = new QTextEdit;
setCentralWidget(textEdit);
textEdit->installEventFilter(this);
textEdit->viewPort->installEventFilter(this);
}
bool MainWindow::eventFilter(QObject *obj, QEvent *event) { if (obj == textEdit)
{
if (event->type() == QEvent::KeyPress)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
qDebug() << "Ate key press" << keyEvent->key();
return true;
}
else
{
return false;
}
}
else if (obj == textEdit->viewPort())
{
// To do.....
if (event->type() == QEvent::mouseMove)
{
return true;
}
}
else
{
// pass the event on to the parent class
return QMainWindow::eventFilter(obj, event);
}
}