Этот фокус клавиатуры
Я пишу программу на Qt, которая выглядит так:

Главное окно - это мой класс Window : QWidget, он имеет QGridLayout, содержащий четыре других виджета (Input_Menu : QWidget и Output_Menu : QWidget, а затем два Canvas : QWidget)
Я хотел бы вызвать определенные события, когда пользователь нажимает клавишу. Проблема в том, что Window иногда теряет фокус (он идет, скажем, к Input_Menu, или, возможно, кнопка в Input_Menu...)
Я пробовал следующие решения, но они кажутся неудовлетворительными (и грязный):
- дайте
Windowфокус всякий раз, когда он теряет его. - скажите каждому виджету, у кого может быть фокус, чтобы вызвать функцию
WindowKeyPressEvent(или ее клон) всякий раз, когда он получает событие клавиатуры.
std::cout << "key pressed" << std::endl; в свою функцию Window::KeyPressEvent. Когда я впервые запускаю свою программу, кажется, что фокус находится на верхнем QComboBox в Input_Menu: Если я нажимаю клавиши Up/Down, я перемещаюсь в этом окне, и никакая "клавиша нажата" не отображается в моей консоли. Если я попадаю в большинство букв, ничего не происходит. Но если я нажму левую / правую клавиши, я получу "нажатую клавишу" в моей консоли!?
Большое спасибо в продвигайтесь вперед для вашего понимания.
2 ответа:
Вы можете установить фильтр событий на
QApplication, чтобы отфильтровать соответствующие событияQEvent::KeyPressглобально. Из документации Qt:Также можно фильтровать все события для всего приложения, установив фильтр событий на QApplication или QCoreApplication объект. Такие глобальные фильтры событий вызываются перед объектно-ориентированные фильтры. Это очень мощно, но и замедляет процесс. доставка событий каждого отдельного события во всем приложении; другой вместо этого, как правило, следует использовать обсуждаемые методы.
Помимо соображений производительности, не забудьте проверить, имеет ли ваше окно в данный момент фокус, прежде чем фильтровать ключевое событие, или вы можете нарушить всплывающие диалоги или ввод в другие окна.