2015-01-18 4 views
1

QWidget 창을 고려해보십시오. 마우스가이 창에서 나왔을 때 어떤 이벤트가 트리거됩니까?마우스가 실제로 QWidget을 떠났는 지 확인하는 방법은 무엇입니까?

창에 QLineEdit 필드가 있으며 입력 제안 사항에 대한 완성 자 (QCompleter)가 있습니다. 실제 목표는 마우스가 창을 떠날 때 그러한 (열린) 완성자를 사라지게 만드는 것입니다. 일부 환경에서는 마우스를 다른 창 위로 이동하면 다른 창에 포커스가있을 수 있지만 키보드 이벤트는 여전히 QLineEdit 필드로 보내지므로 (부모 창에 더 이상 집중하지 않아도) 혼란 스럽습니다.

QWidget :: leaveEvent (QEvent * 이벤트)를 (윈도우에서) 구현하고 현재 표시된 완성 자 팝업을 찾아 숨겨서 팝업을 닫을 수 있습니다. 그러나 역설적이게도 leaveEvent()는 마우스를 팝업 위로 이동하면 숨겨집니다 (팝업에서 항목을 클릭 할 수 없게됩니다). 윈도우가 팝업을 간접적으로 소유하고 있어도 팝업이 다른 QWidget이기 때문에 의미가 있다고 생각합니다.

그렇다면 마우스가 실제로 QWidget 창을 벗어 났는지 어떻게 확인합니까?

답변

1

파생 클래스에서 QWidget::leaveEvent(QEvent *event)을 다시 구현하지만, rect().contains(mapFromGlobal(QCursor::pos()))이 참인지 확인하십시오.

그렇지 않은 경우 아무것도하지 않고 돌아옵니다. 마우스가 위젯 위에있는 모든 이벤트를 필터링해야합니다.

희망이 있습니다.

+0

'leaveEvent'는 신호가 아닙니다. 어쩌면 당신은'leaveEvent' 내부에서 검사 기능을 구현하거나 호출 할 수 있습니까? – Serge

+0

아, 네가 맞아, 내 머리에 무슨 일이 일어나고 있는지 잘 모르겠다. 네, 기본적으로 leaveEvent에 대한 콜백을 필터링하고 leaveEvent를 다시 구현 한 다음 팝업을 정리합니다. – Atlante45

관련 문제