2014-01-09 3 views
1

У меня возникают проблемы с координацией координат для работы по назначению. По какой-то причине результат обычно отключается, если не выполняется очень специфическое условие.Сопоставление координат с элементом, который не работает должным образом

Ниже приведен пример сценария:

enter image description here

Объекты упорядочены в виде дерева, причем каждый узел является 100 пикселей квадрат. Сопоставление выполняется с каждого узла на родительский элемент первого узла. Элементы отправляются, поскольку они упорядочены, например. 1 является родительским элементом 2 и 4, 2 является родителем 3 и т. Д.

  • Узел 0 находится в локальных координатах 0,0 в его родительском объекте, поэтому логически отображает положение узла 0, возвращает 0,0
  • Node1, однако, не возвращает 100, 100, вместо этого он возвращает 200, 200
  • Node2 и 3 ведут себя по-другому, на этот раз значения правильно увеличиваются с предыдущего (неправильного) значения узла до 300, 300 и 400, 400 соответственно
  • Node4 возвращает 300, 700, хотя это всего лишь 100 пикселей ниже узла 2
  • Node5 - 200, 1000
  • Node6 - 300, 700 - это меньше, чем узел 5, но показывает более низкое значение Y
  • Node7 - 200, 1400 - 100 пикселов ниже узла 6 возвращается 700 дополнительных пикселей у значение

Это кажется как это сопоставление не делает то, что я предполагаю, что он делает, что создает координату, абсолютную для объекта, на который отображается, например верхний левый угол узла 0. Что следует производить ожидаемые значения:

  • NODE0 0, 0
  • Node1 100, 100
  • Node2 200, 200
  • node3 300, 300
  • Node4 200, 400
  • Node5 100, 500
  • Node6 200, 600
  • Node7 100, 700

Кажется, что каждый новый ребенок на заданном уровне сбивает результат. Любая идея, что здесь происходит?

ответ

1

После изучения метода mapToItem я пришел к выводу, что это не подходящий инструмент для работы, поэтому я написал свой собственный.

QPointF absolutePosition() { 
     QPointF p(0, 0); 
     QQuickItem * item = this; 
     while (item != Object::_rootUI) { // absolute position relative to _rootUI 
      p += item->position(); 
      item = item->parentItem(); 
     } 
     return p; 
    }