http://qt-project.org/doc/qt-5/qwidget.html#keyPressEvent
Обратите внимание, что QKeyEvent начинается с isAccepted () == true, так что вы не
нужно вызвать QKeyEvent :: accept () — просто не вызывать базовый класс
реализация, если вы действуете на ключ.
http://qt-project.org/doc/qt-5/qkeyevent.html#details
Ключевое событие содержит специальный флаг принятия, который указывает, является ли
получатель будет обрабатывать ключевые события. Вы должны вызвать ignore (), если
событие нажатия клавиши или отпускания не обрабатывается вашим виджетом. Ключевое событие
распространяется вверх по цепочке родительского виджета, пока виджет не примет его
с помощью accept () или его использует фильтр событий. Ключевые события для
мультимедийные клавиши игнорируются по умолчанию. Вы должны позвонить accept (), если
Ваш виджет обрабатывает эти события.
Это немного сбивает с толку. Должен ли я позвонить принять или нет? Должен ли я вызвать базовую реализацию или вызвать игнорировать, если я не обработаю это?
Первая страница читает, мне не нужно вызывать accept (), вторая читает «распространяется по цепочке родительского виджета, пока виджет не примет его с принять ()«
Если я вызову базовую версию, она будет вызывать ignore (), если это QWidget. Не значит ли это, что он вернется к моему keyPressedEvent, вернется с игнорируемым состоянием, а затем снова будет вызвана версия QWidget, потому что «событие ключа передается до родительского виджета»?
Как говорится, оно принимается автоматически. Так что, если вы справляетесь с этим, вам не нужно ничего делать. Только если вы не обрабатываете ключевое событие, вы должны позвонить ignore()
,
Если ваш класс является подклассом QWidget
и, если вы обрабатываете ключевое событие, то не вызывайте базовую реализацию. Если вы не справитесь, Вы можете просто вызвать базовую реализацию, как она будет вызывать ignore()
.
Ты можешь читать этот, если вы хотите узнать больше о принятии и игнорировании событий.
Это означает, что если вы решите игнорировать это будет распространяться на parent widget
, Если вы решите принимать это будет не распространяться на parent widget
,
Базовый класс отличается от родительского виджета. Базовый класс — это класс, из которого происходит ваш класс. Родительский виджет — это объект, который содержит this
объект как его дочерний виджет Обычно это виджет, который передается вашему конструктору в качестве аргумента. Но если родительский виджет QWidget
типа, тогда да, это было бы так.
Других решений пока нет …