QWidgetWindow как QObject в фильтре событий с Qt5

При переходе с Qt4 на Qt5 для некоторого кода я должен фильтровать события в моем приложении, но он больше не работает. Мое программное обеспечение должно фильтровать все события в «режиме редакции», поэтому только несколько виджетов / кнопок могут быть доступны / доступны для нажатия.

У меня есть класс InputGrabber с QVector указателей на QWidget и eventFilter функция. При переходе в режим «Редактировать» я добавляю указатели виджетов к QVector из моего InputGrabber это будет доступно:

_inputGrabber->add (_gpView);
_inputGrabber->add (_gpView->viewport ());
_inputGrabber->add (_gpView->horizontalScrollBar ());
_inputGrabber->add (_gpView->verticalScrollBar ());
_inputGrabber->add (_view->mainWindow().toolBarMap()["editSquel"]);

а затем в функции eventFilter код выглядит так:

bool InputGrabber::eventFilter (QObject* object, QEvent* anevent)
{
if (QInputEvent* event = dynamic_cast <QInputEvent*> (anevent))
{
QWidget* widget = dynamic_cast <QWidget*> (object);
if (widget)
{
if (_widgetList.contains (widget) || _widgetList.contains (widget->parentWidget ()))
return QObject::eventFilter (object, event);
else if (QDialog* dlg = dynamic_cast <QDialog*> (widget))
return QObject::eventFilter (object, event);
else if (QDialogButtonBox* dlg = dynamic_cast <QDialogButtonBox*> (widget->parentWidget ()))
return QObject::eventFilter (object, event);
else
return true;
}
else
return true;
}
else
return QObject::eventFilter (object, event);
}
}

Проблема, переходящая на Qt5, заключается в следующем:

QWidget* widget = dynamic_cast <QWidget*> (object);

возвращается NULL когда объект наследует от QWidgetWindow,

Кто-нибудь нашел такую ​​же проблему и получил решение, которое следует той же стратегии? Я не хотел бы изменять поведение моего программного обеспечения, делать циклы на всех виджетах и ​​настраивать setDisabled() для каждого.

Большое спасибо!

1

Решение

Я думаю, что ваш код здесь не так:

return QObject::eventFilter (object, event);

должно быть

return QObject::eventFilter (object, anevent);

и возможно:

bool InputGrabber::eventFilter (QObject* object, QEvent* anevent)
{
if (QInputEvent* event = dynamic_cast <QInputEvent*> (anevent))
{
//etc
}
return QObject::eventFilter (object, anevent);
}

таким образом, если вы явно не вернете true или false, это всегда будет правильно распространять событие в цепочке.

Если ваши приведения не пройдены, просто ничего не возвращайте, и пусть они возвращаются к последней строке. Если каким-то образом вы останавливаете распространение события, когда встречаете объект, о котором ничего не знаете (например, Таинственная QWidgetWindow) вы, вероятно, нарушаете логику пользовательского интерфейса. Если вы позволите распространению продолжаться, очень вероятно, что ожидаемое событие рано или поздно выйдет.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]