Я работал над некоторым кодом Qt, и мне нужно было передать событие нажатия клавиши в дочерний виджет (в QScrollArea).Я не могу вызвать keyPressEvent()
напрямую, потому что он защищен, поэтому я решил просто позвонить event()
и позволить ему обработать событие (обратите внимание, что это существующее событие в переопределении keyPressEvent()
содержащей области прокрутки).Метод event()
является общедоступным и виртуальным в базовом классе QObject
, но он защищен в QWidget
.Итак, я закончил тем, что сделал что-то вроде этого:
((QObject*)(childWidget())->event(e);
Это работает, и AFAICT совершенно нормально делать в Qt.Возможно, я мог бы также вызвать QCoreApplication::postEvent()
или подобное, но я бы подумал, что это потребует дополнительных затрат (и может даже привести к бесконечному циклу, если событие вернется от дочернего элемента к родительскому, что приведет к его повторной публикации и т. Д.).
Мой вопрос: почему Qt делает event()
защищенным для производного класса QWidget
, в то время как он является открытым для базового класса QObject
?Это действительно вопрос разработки, а не реализации.
Как связанный вопрос, я знаю, что Qt стремится поддерживать двоичную совместимость между выпусками - сделает ли этот метод публичным изменение двоичной совместимости?Метод уже объявлен виртуальным, поэтому я не думаю, что он изменит какие-либо двоичные сигнатуры.Это действительно для моего собственного назидания - у меня нет никаких притяжений в Qt или чем-то подобном.