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