2011-04-25 5 views
2

일부 Qt 코드에서 작업 중이므로 QScrollArea의 하위 위젯에 키 누르기 이벤트를 전파해야했습니다. 그것은 보호되어 있기 때문에 keyPressEvent()을 직접 호출 할 수 없습니다. 따라서 event()을 호출하고 이벤트를 처리하게됩니다. (이는 포함 된 스크롤 영역의 기존 이벤트 인 keyPressEvent() 재정의입니다.) event() 메서드는 공개 클래스이며 가상 클래스는 QObject이지만, QWidget에서 보호됩니다. 그래서, 이런 식으로 일을 끝냈습니다 :Qt : QWidget에서 event()가 선언 된 이유

((QObject*)(childWidget())->event(e); 

그건, 그리고 AFAICT Qt에서 할 완벽하게 괜찮습니다. 아마도 QCoreApplication::postEvent() 또는 이와 비슷한 전화를 할 수도 있지만, 오버 헤드가 더 많이 걸릴 것이라고 생각합니다. 이벤트가 자식에서 부모로 돌아 왔을 경우 무한 루프가 발생할 수도 있습니다. 다시 게시하면됩니다.

제 질문은 Qt가 QObject 기본 클래스에있는 동안 QWidget 파생 클래스에서 event()을 보호하는 이유는 무엇입니까? 이것은 실제로 구현보다는 디자인 문제입니다.

관련 질문으로, Qt가 릴리스 간 바이너리 호환성을 유지하려고 노력하고 있음을 알고 있습니다.이 메서드는 공용 이진 호환성을 변경하겠습니까? 이 메소드는 이미 가상으로 선언되었으므로 이진 서명을 변경하지 않을 것이라고 생각합니다. 이것은 내 자신의 덕목을위한 것입니다. Qt 나 다른 것을 끌어들이지는 못합니다.

답변

1

일반적으로 자식 위젯은 일반적으로 부모가 아닌 경우 항상 있기 때문에 자식 위젯에서 부모 위젯으로 이벤트가 전파됩니다. 이 전파는 위젯 코드에서 내부적으로 수행되므로 수동으로 수행 할 필요가 없습니다.

위젯 수준에서 메소드가 보호 될 수있는 한 가지 이유는 이벤트를 역순으로 (즉, 부모에서 자식으로) 전파하려는 것에 대해 두 번 생각하게하는 것입니다. 왜 다른 방향으로해야합니까?

+0

어떤 이유로 든 키 누름 이벤트는 스크롤되는 위젯이 아닌 'QAbstractScrollArea' 파생 클래스로 이동합니다. 다른 이벤트 (예 : 마우스 휠) 이벤트가 먼저 자식에게 전달됩니다. 나는 Qt 4.5를 사용하고 있음을 주목해야한다. Qt의 다른 버전에서는 다를 수있다. –

관련 문제