2016-10-12 31 views
0

うーん...このタスクはC++で実装する必要がありますか?私は(OSXで例えばQuickTimeの)のようなメディアプレーヤーを作ることにQMLを使用しています...QML: "全体"ウィンドウのマウス移動イベントを監視する

を知らないマウスイベントを検出することができますインターフェイス、:

マウスアイドル期間のためにすべてのコントロールパネルを非表示にして、VideoOutputのみを表示します。または、マウスが窓から出てすぐに、すぐに同じことをしてください。

だから私の要件は次のとおりです。

  1. モニタ、マウス移動イベント全体のウィンドウ内
  2. は、他のコンポーネントに元のマウスイベントをブロックしません。

より正確に、擬似コードを参照してください。

MouseArea { 
    anchors.fill: applicationWindow // <- This is wrong and will throw error 
    hoverEnabled: true 

    /* After reading the Qt doc, this property seems should be 
    placed in a MouseArea, which is under another MouseArea. 
    When child has mouse event, it propagate up to parent MouseArea. 
    So this should be also wrong. */ 
    propagateComposedEvents: true 
    onClicked: mouse.accepted = false; 
    onPressed: mouse.accepted = false; 
    onReleased: mouse.accepted = false; 
    onDoubleClicked: mouse.accepted = false; 
    onPressAndHold: mouse.accepted = false; 
    onPositionChanged: { 
     console.log("moved!", mouse.x, mouse.y) 
     mouse.accepted = false 
    } 
} 
+2

'anchor.fill:parent'よりも' MouseArea'をウィンドウの最後の子アイテムとして配置してください。 'propagateComposedEvents'は必要ありません。 – Fabio

+1

anchors.fill:applicationWindow.contentItem – folibis

+2

C++ソリューションを調べるには、 'QGuiApplication'オブジェクトにイベントフィルタをインストールする必要があります。 'QObject :: eventFilter()'を参照してください –

答えて

1

をQML通報は、あなたがそれを処理するか残すことができるのいずれか特定のイベント・チェーンがあること、です。

したがって、clicked -eventを1つのMouseAreaで処理する場合は、pressed -eventを伝播することはできません。

しかし、これは十分な解決策になるかもしれません:

Rectangle { 
    width: 50 
    height: 50 
    color: 'orchid' 
    MouseArea { 
     anchors.fill: parent 

     drag.target: parent 
    } 
} 

MouseArea { 
    anchors.fill: parent 
    hoverEnabled: true 
    propagateComposedEvents: true 
    onMouseXChanged: console.log(mouseX) 
    onPressed: { 
     mouse.accepted = false 
    } 
} 

限り、ボタンが押されているものを処理していないながら、あなたが、他のすべてupponあるMouseAreaでマウスの動きを扱います。

MouseMovementについての情報が必要な場合は、使用している他のすべてのMouseAreaでシングルリング信号を作成するか、自分のqmlファイルごとにシグナルを伝播することができます。

したがって、すべてのMouseAreaにmouse.accepted = falseと書くのではなく、mySingleton.mouseEventSignal()と書いてください。アイテムと座標を追加することもできるので、座標をあなたが望むものにマップすることができます。

これは、高速で汚れたプロトタイプには十分です。実際には、ケビン・クラマーが提案したようにC++で行う必要があるかもしれません。

関連する問題