Qt: Почему event () объявлен защищенным в QWidget - PullRequest
2 голосов
/ 26 апреля 2011

Я работал над некоторым кодом Qt, и мне нужно было передать событие нажатия клавиши в дочерний виджет (в QScrollArea).Я не могу вызвать keyPressEvent() напрямую, потому что он защищен, поэтому я решил просто позвонить event() и позволить ему обработать событие (обратите внимание, что это существующее событие в переопределении keyPressEvent() содержащей области прокрутки).Метод event() является общедоступным и виртуальным в базовом классе QObject, но он защищен в QWidget.Итак, я закончил тем, что сделал что-то вроде этого:

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

Это работает, и AFAICT совершенно нормально делать в Qt.Возможно, я мог бы также вызвать QCoreApplication::postEvent() или подобное, но я бы подумал, что это потребует дополнительных затрат (и может даже привести к бесконечному циклу, если событие вернется от дочернего элемента к родительскому, что приведет к его повторной публикации и т. Д.).

Мой вопрос: почему Qt делает event() защищенным для производного класса QWidget, в то время как он является открытым для базового класса QObject?Это действительно вопрос разработки, а не реализации.

Как связанный вопрос, я знаю, что Qt стремится поддерживать двоичную совместимость между выпусками - сделает ли этот метод публичным изменение двоичной совместимости?Метод уже объявлен виртуальным, поэтому я не думаю, что он изменит какие-либо двоичные сигнатуры.Это действительно для моего собственного назидания - у меня нет никаких притяжений в Qt или чем-то подобном.

1 Ответ

1 голос
/ 26 апреля 2011

Обычно события передаются от дочерних виджетов к родительским виджетам, поскольку дочерние виджеты обычно, если не всегда, располагаются перед их родителями. Это распространение выполняется для вас внутренне в коде виджета, и поэтому нет необходимости делать это вручную.

Я подозреваю, что одна из причин, по которой метод может быть защищен на уровне виджетов, состоит в том, чтобы заставить вас дважды подумать о попытке распространения события в обратном порядке, то есть от родителя к потомку. Зачем вам нужно делать это наоборот?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...