QtQuick按键事件传播

时间:2016-06-29 10:05:18

标签: c++ qt qtquick2

我有Qt GUI应用程序。主窗口包含使用窗口容器放置在其上的QtQuick组件:

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

我想在整个窗口下处理所有关键的新闻事件。但是我面临的问题是,当QtQuick组件获取焦点时,我无法处理关键事件,即使我已将窗口设置为父窗口。

documentation说这种行为是预期的:

  

QWidget * QWidget :: createWindowContainer(QWindow *窗口,QWidget * parent => Q_NULLPTR,Qt :: WindowFlags flags = Qt :: WindowFlags())
  ...
  窗口容器具有许多已知的限制:
  ...
  焦点处理;可以让窗口容器实例具有任何焦点策略,并且它将通过调用QWindow :: requestActivate()将焦点委托给窗口。但是,从QWindow实例返回到正常焦点链将取决于QWindow实例本身。例如,当进入具有标签焦点的基于Qt Quick的窗口时,很可能进一步的标签按下仅在QML应用程序内循环。此外,QWindow :: requestActivate()是否实际给出窗口焦点,取决于平台。

我的问题是:即使QtQuick组件获得了焦点,有没有办法在整个窗口下处理按键事件?

GitLab提供的最小完整示例。

1 个答案:

答案 0 :(得分:0)

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

  1. 处理QML中的按键事件;
  2. 通过信号通知QML中的C ++代码;
  3. 在C ++代码中生成按键事件;
  4. 处理常见事件过滤器中的本机事件和重新生成的事件。
  5. GitLab可用的示例。