QwidgetWindow作为QT5的事件过滤器中的QObject



在从QT4到QT5的迁移中,对于某些代码,我必须在应用程序上过滤事件,但它不再起作用。我的软件必须在"版本模式"时过滤所有事件,因此只能可用/单击几个小部件/按钮。

我有一个InputGrabber的类QVector,指针为QWidgeteventFilter函数。传递到"编辑"模式时,我将小部件的指针附加到我的 InputGrabberQVector上:

_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逻辑。如果让传播继续进行,那么您等待的事件很可能会出来。

相关内容

  • 没有找到相关文章

最新更新