2016-06-29 5 views
1

У меня есть приложение GUI GUI. Главное окно содержит компонент QtQuick, который размещен на нем с помощью окна контейнера:QtQuick ключевое событие распространения пресса

QQuickView * view = new QQuickView(); 
QWidget * container = QWidget::createWindowContainer (view, this); 

я хотел бы, чтобы обрабатывать все события нажатия клавиш под всем окном. Но я столкнулся с проблемой, что я не могу обрабатывать ключевые события, когда фокус, полученный компонентом QtQuick, даже если я установил для него окно как родительское.

documentation сказать, что такое поведение, как ожидается:

QWidget * QWidget :: createWindowContainer (QWindow * окно, QWidget * Родитель => Q_NULLPTR, Qt :: WindowFlags флаги = Qt :: WindowFlags())
...
контейнер окно имеет ряд известных ограничений:
...
обработка фокуса; Можно предоставить экземпляру контейнера окна какую-либо политику фокуса, и он делегирует фокус на окно через вызов QWindow :: requestActivate(). Однако возврат к нормальной цепочке фокуса из экземпляра QWindow будет выполняться непосредственно над реализацией экземпляра QWindow. Например, при входе в окно Qt Quick based с фокусом вкладки вполне вероятно, что дальнейшие нажатия клавиш будут циклироваться только внутри приложения QML. Кроме того, QWindow :: requestActivate() фактически дает фокус окна, зависит от платформы.

Мой вопрос: есть ли способ обрабатывать событие нажатия клавиш под всем окном, даже если фокус приобретается компонентом QtQuick?

Минимальный и полный пример доступен по адресу GitLab.

ответ

0

Один из возможных (но некрасиво) решение:

  1. ручки нажмите клавишу событие в QML;
  2. Уведомлять код C++ из QML по сигналу;
  3. В коде C++ генерируется событие нажатия клавиши;
  4. Обработать собственное событие и регенерированное событие в общем фильтре событий.

Пример: GitLab.

Смежные вопросы