在从QT4到QT5的迁移中,对于某些代码,我必须在应用程序上过滤事件,但它不再起作用。我的软件必须在"版本模式"时过滤所有事件,因此只能可用/单击几个小部件/按钮。
我有一个InputGrabber
的类QVector
,指针为QWidget
和eventFilter
函数。传递到"编辑"模式时,我将小部件的指针附加到我的 InputGrabber
的QVector
上:
_inputGrabber->add (_gpView);
_inputGrabber->add (_gpView->viewport ());
_inputGrabber->add (_gpView->horizontalScrollBar ());
_inputGrabber->add (_gpView->verticalScrollBar ());
_inputGrabber->add (_view->mainWindow().toolBarMap()["editSquel"]);
然后,在事件换算器函数上,代码会如下:
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);
当对象从QWidgetWindow
继承时返回NULL
。
有人找到了相同的问题并获得了遵循相同策略的解决方案吗?我不想更改软件的行为,在所有小部件上制作循环,并为每个小部件设置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);
}
以这种方式,如果您不明确返回真或错误,它将始终正确地传播链中的事件。
如果您的演员阵容失败了,只是不要返回任何东西,然后让它回到最后一行。如果您以某种方式停止事件传播时,当您遇到一个对象时,您对(例如 Misterious QwidgetWindow)一无所知,您可能会破坏UI逻辑。如果让传播继续进行,那么您等待的事件很可能会出来。