使用QGraphicsScene和Qt :: X11Bypasswindowmanagerhint在X11中生成BadMatch错误

时间:2013-03-12 10:57:22

标签: qt x11 qgraphicsview

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

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

1 个答案:

答案 0 :(得分:0)

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