QWidget似乎忽略了EventFilter

时间:2018-06-27 10:00:02

标签: qt qt5

尝试通过QT eventFilter传递事件时遇到问题。

bool MainWindow::eventFilter(QObject *obj, QEvent *event){
if(event->type() == QEvent::Wheel){
    QPoint pos = QCursor::pos();
    QWidget *widget = QApplication::widgetAt(pos);
        if(widget != NULL){
            widget->setVisible(false); //for Test purposes only
            qDebug() << widget; //also for test 
            QApplication::sendEvent(widget, event); //should send event to widget?
                return true;
            }

                return true;
        }
    return false;
}

我想捕捉鼠标滚轮的滚动并将其立即传递给多个QWidget。如果我在没有sendEvent的情况下执行上述操作,我想参加的小部件将消失(这就是我想要进行测试的内容)。如果我使用sendEvent,则什么也不会发生,否则会因分段错误而崩溃……我尝试了网上发现的任何事情(或者至少是这样)。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

当您呼叫QApplication::sendEvent(widget, event);widgetMainWindow的子代或本身时,接收事件将在MainWindow::eventFilter中再次过滤。它创建了一个递归的无限循环。 如果事件正在发送,我在sendingEvent上添加了一个标志return true;。希望能有所帮助。

bool MyWindow::eventFilter(QObject *obj, QEvent *event){

    if (event->type() == QEvent::Wheel)
    {
        static bool sendingEvent = false;
        if (sendingEvent)
        {
            //exit recursive call, return false to avoid swallowing the event
            return false;
        }
        QPoint pos = QCursor::pos();
        QWidget *widget = QApplication::widgetAt(pos);
        if (widget != NULL){
            qDebug() << widget; //also for test         

            //set the flag before sending event
            sendingEvent = true;

            QApplication::sendEvent(widget, event); //should send event to widget?

            //reset the flag after sending event
            sendingEvent = false;
            return true;
        }
        return true;
    }
    return false;
}