Qt eventFilter无法过滤mouse事件

来源:互联网 发布:国家税务局网络 编辑:程序博客网 时间:2024/05/29 09:13

最近做了个测试发现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);    } }


原创粉丝点击