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