【问题标题】:QLayout receive all events of another QWidgetQLayout 接收另一个 QWidget 的所有事件
【发布时间】:2014-02-03 13:30:13
【问题描述】:

有一个非常自定义的 QWidget “A”,我没有代码,我只能接收它的 QWidget* 指针。而且我必须在“A”收到任何事件(某种事件过滤器)之前接收所有“A”的事件并处理它们。

现在我已经尝试在它上面放置另一个非常简单的 QWidget“B”,但我无法让这个“B”完全透明(我需要保持“A”全部可见)。

下一个想法是在“A”之上放置一个QLayout“C”,但是这个布局没有接收到足够的事件(实际上:我把一个qDebug()语句放到了“C”::event(QEvent *evt),它根本没有被执行——所以布局从来没有收到任何事件)。

有什么方法可以在“A”之前获取“A”的事件,以便我可以对它们进行预处理,可能会确认一些事件并将其他事件推到“A”?

P.S.:"A" 进行 OpenGL 绘画,但它不是从 QGLWidget 派生的。我放在上面的任何小部件都覆盖了所有“A”,设置“WA_PointOnScreen”或“WA_TranslucentBackground”等属性没有产生任何可用的结果。

P.P.S.:使用 QLayout(如 QGridLayout)的想法很好,因为我需要在“A”顶部放置一些小部件,它们也可能会遮挡“A”(但可以根据需要隐藏它们)。

编辑:我刚刚尝试了"C"->installEventFilter("A") 并实现了 bool "C"::eventFilter(QObject* QEvent*) - 无济于事 - eventFilter 永远不会执行...

编辑:因为我只是不想放弃,所以我再次尝试了 QWidget 方法。我找到了 WidgetAttribute WA_DontShowOnScreen,这有点帮助:

  • 我收到各种鼠标事件
  • 我收到了大多数窗口系统事件(至少有绘制和调整大小)
  • 我错过了任何键盘事件 - 这并不奇怪,因为不可见的小部件通常与键盘无关...
  • 我错过了进入/离开事件 - 也不是很奇怪,但是为什么我会收到鼠标事件呢?

【问题讨论】:

    标签: c++ qt4


    【解决方案1】:

    所以我终于让它工作了:

    • 根据您的需要子类 QLayout
    • 查看您的 QWidget "A" 是否附加了任何 QLayout
      • 如果是:您的 QLayout 应该是同一类型的,因此您可以将“A”的子级重新附加到它
      • 如果不是:太好了,只需附加您的自定义布局"A"->setLayout(myLayout);
    • 子类 myLayout 需要一些东西来解决问题:
      • 重新实现 eventFilter() 函数
      • "A"->installEventFilter(myLayout);
      • 在事件过滤器中:
      • if(event->type() == QEvent::Enter) grabKeyboard();
      • if(event->type() == QEvent::Leave) releaseKeyboard();
      • ...您想要实现的所有事件管理...

    让它工作的关键是我对 Qt 文档关于“installEventFilter”的误解。 “filterobject”是想要获取所有事件的对象,被监控的对象是我们想要从中获取任何事件的对象。然后过滤器的安装工作就像(并且考虑它使其完全合乎逻辑):monitoredObject->installEventFilter(filterobject);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-14
      • 2014-07-29
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多