【问题标题】:Using QGraphicsScene and Qt::X11Bypasswindowmanagerhint produces BadMatch Error in X11使用 QGraphicsScene 和 Qt::X11Bypasswindowmanagerhint 在 X11 中产生 BadMatch 错误
【发布时间】:2013-03-12 10:57:22
【问题描述】:

我正在使用 QGraphicsScene 和 QGraphicsViews 为每个监视器在 Qt 4.8 中开发适用于 Linux(RHEL、Gnome、Compiz)的应用程序。每个 QGraphicsView 都有 Qt::X11Bypasswindowmanagerhint 窗口提示。为了恢复键盘焦点,我有一个事件处理程序,它在每个事件的恰好一个 QGraphicsViews 上调用 activateWindow()(我意识到这可能是过度杀伤并且效率极低)。该应用程序是用户可能要求经常隐藏和显示它的应用程序;当我在事件处理程序中激活的同一特定 QGraphicsView 上调用 show() 时,会发生 X11 错误事件。特别是该错误的错误代码为8,对应于BadMatch错误,主要操作代码为42,我认为对应于XSetInputFocus()。

首先,这是一个可以通过自定义 x11 事件处理程序简单地忽略的错误吗(因为应用程序实际上可以工作)? 其次,在将这个特定的窗口提示与 QGraphicsView 一起使用时,是否有更好的方法来调用 activateWindow?如果没有,至少有办法避免这个错误吗?

【问题讨论】:

    标签: qt x11 qgraphicsview


    【解决方案1】:

    好吧,我想我解决了自己的问题。发生的事情是调用 show() 当然会导致 QEvent::show() 事件,事件过滤器会选择该事件。因此,我试图在调用 show 后立即激活窗口,根据我做了here 的一些研究,这可能会导致观察到 X11 错误。解决方案是只为 QEvent::Enter 事件调用 activateWindow(),这些事件在为小部件调用 show() 之后发生。这不仅效率更高,而且可以正确地将键盘焦点转移到文本字段,并且到目前为止,在我的测试中,不会产生任何 X11 错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      相关资源
      最近更新 更多