2013-04-24 14 views
6

MouseAreaをQML要素に置くと、MouseAreaはすべてのマウスイベントを盗みます。 したがって、TextEditは編集不可能で、選択不可能です。MouseAreaがQML要素のマウスイベントを盗んだ

TextEdit { 
    // some properties 
    MouseArea { 
     // some properties 
     OnClicked: { /* do something */ } 
    } 
} 

解決方法はありますか?

ところで、大きなMouseAreaを別のMouseAreaに置くと、より大きなMouseAreaがすべてのマウスイベントを盗みます。私はそれをどのように解決するのですか?手動でマウスイベントを渡すと解決できると思いますが、どうやったらいいですか?

答えて

15

clickedまたはreleasedのような構成イベントを、@ Torgeirlの答えに記載されているように、下のコンポーネントに伝播できるようにする必要があります。

あなたがイベントのこれらの種類を受け取るためにあなたのTextEditSliderまたはCheckBoxをしたい場合は、単にfalseにそのacceptedプロパティを設定することで、イベントを通過します。

サンプルコード:

RowLayout { 
    TextEdit { text: "Hi" } 
    Slider {} 
    CheckBox { text: "CheckBox"} 

    MouseArea { 
     anchors.fill: parent 
     propagateComposedEvents: true 

     onClicked: mouse.accepted = false; 
     onPressed: mouse.accepted = false; 
     onReleased: mouse.accepted = false; 
     onDoubleClicked: mouse.accepted = false; 
     onPositionChanged: mouse.accepted = false; 
     onPressAndHold: mouse.accepted = false; 
    } 
} 
+2

私はこれを見つけたときに何かの解決策を探していましたが、ちょうど 'マウスを設定するシグナルハンドラがいくつかあることを指摘したいと思っていました。accepted = false'は何の効果もありません( 'MouseArea' docsはそれらをすべて検索する効果がありません)。 – Mitch

+1

mouseXとmouseYで継続的な更新が必要な場合、この解決法は機能しません。上記のサンプルコードのTextEditをマウスのX、Yの位置を示すように変更すると、マウスボタンが押されたときに更新が停止することがわかります。 onPressedで "mouse.accepted = false"を設定すると、ボタンが離されるまでMouseAreaプロパティが更新されません。これがバグかどうか分かりませんか? –

0

あなたはあなたの特定のケースのために、このような何かを試すことができます:私はにこれらを配置している

Rectangle 
{ 
    MouseArea 
    { 
     id: mouseAreaTop 
     anchors.fill: parent 
     OnClicked: { /* do something */ } 
    } 

    TextEdit 
    { 
     /* Do whatever */  
    } 
} 

注意を。すべての子供は親よりzが高いでしょう。親の木の後に来る兄弟は、より高いz値を持ちます。

一般的なアイデアは、このようなものです:

  1. すべてのマウス領域
  2. は、z上でそれらを並べ定義のzプロパティhere in the Qt documentationについて

読み取り値、あなたはどのように理解することができるようになりますマウス領域を配置します。

例:この例では

Parent 
{ 
    anchors.fill: parent 
    child1 
    { 
     anchors.fill: parent 
     z: 2 
    } 

    child2 
    { 
     anchors.fill: parent 
     z: 1 
    } 

    child3 
    { 
     anchors.fill: parent 
     z: 4 
    } 

    child4 
    { 
     anchors.fill: parent 
     z: 3 
    } 
} 

私は、z値を自分で割り当てることにより、自然順序付けをオーバーライドしています。

+0

のナンバーは、私が欲しいものではありません。あなたの最初の例では、 'TextEdit'が' mouseArea'よりも高いので、mouseEventは出ません。 TextEditがmouseEventを受け入れ、同時に選択できるようにします。私はQt 4でQt 5's'propagateComposedEvents'機能をシミュレートする方法を見つけたいと思っています。 –

5

clicked()などのマウスイベントをMouseAreaが通過できるようにするプロパティpropagateComposedEventsがあります。 イベントハンドラにevent.accepted = falseを設定する必要があります。

詳細と例については、MouseAreaのドキュメントとpropagateComposedEventsのドキュメントを参照してください。

+0

私はQt4を使用しています。私はそれを使用することはできません。 –

関連する問題