2016-02-15 3 views
1

Я хочу обрабатывать нажатые и выпущенные сигналы в двух перекрывающихся Mouseareas.Как обрабатывать нажатые и выпущенные сигналы в перекрывающихся Mousareas?

Краткое объяснение моего дела заключается в следующем:

У меня есть две области мыши M1 и M2. M1 содержится в прямоугольнике, который служит в качестве кнопки. Он имеет фиксированный размер, например, 100x100. M2 заполняет весь экран и определенно больше по размеру, чем M1. Я могу задавать z-свойства M1 и M2 произвольно. Мне нужно обрабатывать нажатые и выпущенные сигналы в обоих этих Mouseareas.

Возможно ли это в QtQuick и если да, то как?

import QtQuick 2.5 
Item { 
    visible: true 
    width:1280 
    height:720 

    Rectangle { 
     color: "blue" 
     width: 100; height: 100 
     z:1 
     MouseArea { 
      id:m1 
      anchors.fill: parent 
      onPressed : { 
       mouse.accepted = false 
       console.log("pressed m1") 
      } 
      onReleased: { 
       console.log("released m1") 
      } 
     } 
    } 

    MouseArea { 
     id: m2 
     anchors.fill: parent 
     onPressed : { 
      console.log("pressed m2") 
     } 
     onReleased: { 
      console.log("released m2") 
     } 
    } 
} 

Я хочу нажать и отпустить для обеих Mouseareas, когда m1 нажат и отпущен.

(Qt версии 5.5)

+0

Почему бы не показывать все, что вы пробовали? –

+0

Звучит очень похоже на этот вопрос: http://stackoverflow.com/questions/35312255/object-to-process-touch-event-but-also-let-it-through. Это касается сенсорных областей, но такое же решение должно применяться. – Mitch

+0

Ссылка на eventfilters была очень полезной, и она идет в правильном направлении и очень хорошо подходит для моего фактического использования! – OnurA

ответ

0

Прежде всего, id s не может начинаться с прописных букв, так что ваши MouseArea s не может быть M1 и M2. Вместо этого они должны быть m1 и m2.

import QtQuick 2.3 

Rectangle { 
    id: root 
    width: 400 
    height: 300 

    Rectangle { 
     id: m1Container 
     width: 100 
     height: 100 
     color: "blue" 
     z: 1 

     MouseArea { 
      id: m1 
      anchors.fill: parent 
      hoverEnabled: true 

      onPressed: { 
       mouse.accepted = false 
       console.log("m1 pressed") 
      } 
      onReleased: { 
       console.log("m1 released") 
      } 
     } 
    } 

    MouseArea { 
     id: m2 
     anchors.fill: parent 

     onPressed: { 
      console.log("m2 pressed") 
     } 
     onReleased: { 
      console.log("m2 released") 
      if(m1.containsMouse) { 
       m1.released(mouse) 
      } 
     } 
    } 
} 

Edit: Я заимствовал идею m1.released(mouse) от ответа по sk2212, и отлажен немного обработать случай, когда мышь находится вне m1 и нажимается и отпускается.

+0

Поскольку я хотел, чтобы это было просто, я не стал подробно останавливаться. Видимо, мне было нужно. Попробуйте этот код и скажите мне, если вы получите нажатые и выпущенные выходы для бота этих мыслей :) – OnurA

+0

Вы попробовали мой? Если не попробовать сначала. –

+0

Я хочу обрабатывать нажатые и выпущенные события одновременно. Так что ваш код делает, если вы нажмете на m1, вы получите только нажатие и отключение m1. Я хочу получить m1 нажата, m1 выпущена, m2 нажата, m2 выпущена – OnurA

1

После комментариев в первом ответе. Что-то вроде этого:

import QtQuick 2.5 
import QtQuick.Window 2.2 

Window { 
    visible: true 
    width:1280 
    height:720 

    Rectangle { 
     color: "blue" 
     width: 100; height: 100 
     z:1 
     MouseArea { 
      id:m1 
      anchors.fill: parent 
      propagateComposedEvents: true 
      onPressed : { 
       mouse.accepted = false 
       console.log("pressed m1") 
      } 
      onReleased: { 
       console.log("released m1") 

      } 
     } 
    } 

    MouseArea { 
     id: m2 
     anchors.fill: parent 
     onPressed : { 
      console.log("pressed m2") 
     } 
     onReleased: { 
      console.log("released m2") 
      m1.released(mouse); 
     } 
    } 
} 

Это печатает то, что вы хотите.

+0

Это прекрасно работает. – OnurA

+0

@OnurA Но когда мышь нажата и выпущена за пределами m1, она показывает «нажата m2, выпущена m2, выпущена m1». Должно ли это быть не просто нажато m2, выпущено m2? –

+0

Да, вы правы. На самом деле этот метод более или менее отвечает на мой вопрос, но я не буду использовать его в своем приложении. Поэтому мне понадобилась большая мышь для пользовательских входов для всего экрана. Однако я решил проблему, удалив m2 и используя eventfilter onQQuickView Item. Поэтому, если кто-то предложит это в качестве ответа, я буду считать его правильным ответом! – OnurA