2013-04-24 1 views
6

Если я поместил MouseArea на элемент QML, то MouseArea украдет все события мыши. Таким образом, TextEdit будет неотделим и не поддается выбору.MouseArea украл события мыши элемента QML

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

Есть ли способ решить эту проблему?

Кстати, если я положил большой MouseArea на другой MouseArea, то больше MouseArea украдет все события мыши. Как это решить? Я думаю, что передача событий мыши вручную может решить это, но как это сделать?

ответ

15

Вы должны включить MouseArea для распространения собранных событий, таких как clicked или released, в нижний компонент, как описано в ответе @ Torgeirl.

Если вы хотите, чтобы ваши TextEdit, Slider или CheckBox получить такого рода событий, просто пройти через событие, установив его свойство accepted к false.

Пример кода:

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

Я искал решение чего-то еще, когда я наткнулся на это, и просто подумал, что я бы указал, что есть некоторые обработчики сигналов, для которых устанавливается «мышь».accept = false' не имеет эффекта (поиск 'MouseArea' docs для' не имеет никакого эффекта ', чтобы найти их все). – Mitch

+1

Это решение не работает, если я хочу постоянно обновлять mouseX и mouseY. Измените TextEdit в приведенном выше примере кода, чтобы показать местоположение мыши X, Y, и вы увидите, что он перестает обновляться всякий раз, когда удерживается кнопка мыши. Установка «mouse.accepted = false» в onPressed приводит к тому, что свойства MouseArea не обновляются до тех пор, пока кнопка не будет отпущена. Не уверен, что это ошибка? –

0

Вы можете попробовать что-то подобное для вашего конкретного случая:

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

    TextEdit 
    { 
     /* Do whatever */  
    } 
} 

Обратите внимание, что я организовал их в порядке. Все дети будут иметь более высокий z, чем родитель. Братья и сестры, следующие позже в дереве для родителя, имеют более высокие значения z.

Общая идея такова:

  1. Определить все области мыши
  2. Расположите их на г ценности

Читайте о г свойство 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 
    } 
} 

В этом примере я переопределить естественный порядок, назначая г значения сам.

+0

Нет, это не то, что я хочу. В первом примере mouseEvent не будет испускать, потому что 'TextEdit' выше, чем' mouseArea'. Я хочу, чтобы «TextEdit» принимал mouseEvent и выбирался одновременно. Я хочу найти способ имитировать функцию Qt 5'propagateComposedEvents' в Qt 4. –

5

Существует свойство propagateComposedEvents, которое позволяет MouseArea пропускать через мыши события, такие как clicked(). Вы должны установить event.accepted = false в обработчике событий.

Для получения дополнительной информации и примера см. Документацию для MouseArea и имущество propagateComposedEvents.

+0

Я использую Qt4. Я не могу его использовать. –