2013-03-12 2 views
0

각 모니터에 대해 QGraphicsScene을 사용하는 QGraphicsScene을 사용하여 Qt 4.8에서 Linux 용 응용 프로그램 (RHEL, Gnome, Compiz)을 개발 중입니다. 각 QGraphicsView에는 Qt :: X11Bypasswindowmanager 힌트 힌트가 있습니다. 키보드 포커스를 복원하기 위해 모든 이벤트에 대해 QWraphicsViews 중 하나에서 activateWindow()를 호출하는 이벤트 핸들러가 있습니다.이 이벤트 핸들러는 과도하고 비효율적 인 것으로 알고 있습니다. 응용 프로그램은 사용자가 자주 숨기거나 표시하도록 요청할 수있는 응용 프로그램입니다. 이벤트 처리기에서 활성화되는 특정 QGraphicsView에서 show()를 호출하면 X11 오류 이벤트가 발생합니다. 특히 오류에는 BadMatch 오류에 해당하는 오류 코드 8과 XSetInputFocus()에 해당하는 42의 주요 작업 코드가 있습니다.QGraphicsScene 및 Qt :: X11BypasswindowmanagerHint를 사용하면 X11에서 BadMatch 오류가 발생합니다.

먼저이 오류는 응용 프로그램이 실제로 작동하기 때문에 사용자 지정 x11 이벤트 처리기를 통해 간단히 무시할 수 있습니까? 둘째,이 특정 창 힌트를 QGraphicsView와 함께 사용할 때 activateWindow를 호출하는 더 좋은 방법이 있습니까? 그리고 그렇지 않다면 적어도이 오류를 피할 수있는 방법이 있습니까?

답변

0

음, 내 문제를 해결 한 것 같습니다. 무슨 일이 있었는지 show()를 호출하는 것은 QEvent :: show() 이벤트로 이어지고, 이벤트 필터가이를 감지합니다. 따라서 쇼를 호출 한 직후에 윈도우를 활성화하려고 시도했는데 어떤 연구에 따르면 here을 수행 한 결과 X11 오류가 발생할 수 있습니다. 해결책은 위젯에 대해 show()를 호출 한 후에 발생하는 QEvent :: Enter 이벤트에 대해서만 activateWindow()를 호출하는 것입니다. 이것은 훨씬 더 효율적 일뿐만 아니라 텍스트 필드에 키보드 포커스를 올바르게 제공합니다. 지금까지 테스트 한 결과 X11 오류가 발생하지 않았습니다.

관련 문제