При переходе с 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()
для каждого.
Большое спасибо!
Я думаю, что ваш код здесь не так:
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) вы, вероятно, нарушаете логику пользовательского интерфейса. Если вы позволите распространению продолжаться, очень вероятно, что ожидаемое событие рано или поздно выйдет.
Других решений пока нет …