2016-06-29 68 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