2013-03-12 130 views
0

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

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

回答

0

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