2016-06-29 67 views
1

我有Qt 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的窗口时,很有可能只有在QML应用程序中循环进一步的标签按压。另外,QWindow :: requestActivate()实际上是否提供了窗口焦点,与平台相关。

我的问题是:即使通过QtQuick组件获得焦点,是否可以在整个窗口下处理按键事件?

最小和完整的示例可在GitLab

回答

0

一种可能(但丑陋)的解决方案是:在QML

  1. 手柄键按压事件;
  2. 通过信号从QML通知C++代码;
  3. 在C++代码中生成按键事件;
  4. 处理常见事件过滤器中的本机事件和重新生成的事件。

示例可在GitLab