尝试通过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,则什么也不会发生,否则会因分段错误而崩溃……我尝试了网上发现的任何事情(或者至少是这样)。
提前谢谢!
答案 0 :(得分:1)
当您呼叫QApplication::sendEvent(widget, event);
且widget
是MainWindow
的子代或本身时,接收事件将在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;
}