0

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

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

4

1 回答 1

0

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

于 2013-03-13T03:53:04.177 回答