Pergunta

Estou tendo problemas para fazer com que o mapeamento de coordenadas funcione conforme o esperado.Por alguma razão, o resultado geralmente está errado, a menos que uma condição muito específica seja atendida.

Aqui está um exemplo de cenário:

enter image description here

Os objetos são ordenados em uma árvore, com cada nó tendo 100 pixels quadrados.O mapeamento é feito de cada nó para o pai do primeiro nó.Os itens são organizados conforme são ordenados, por ex.1 é pai de 2 e 4, 2 é pai de 3 e assim por diante...

  • O nó0 está nas coordenadas locais 0,0 em seu pai, então, logicamente, mapear a posição do nó 0 retorna 0,0
  • No entanto, o Nó1 não retorna 100, 100, em vez disso retorna 200, 200
  • Os nós 2 e 3 se comportam de maneira diferente, desta vez os valores são incrementados corretamente do valor do nó anterior (incorreto) para 300, 300 e 400, 400 respectivamente
  • Node4 retorna 300, 700 mesmo estando apenas 100 pixels abaixo do nó 2
  • Nó5 - ​​200, 1000
  • Nó6 - 300, 700 - é inferior ao nó 5, mas mostra um valor y inferior
  • Nó7 - 200, 1400 - 100 pixels abaixo do nó 6 retorna 700 pixels adicionais no valor y

Parece que esse mapeamento não faz o que presumo que faz, que é produzir uma coordenada absoluta para o objeto que está sendo mapeado, por exemplo.no canto superior esquerdo do Nó 0.O que deve produzir os valores esperados:

  • Nó0 0, 0
  • Nó1 100, 100
  • Nó2 200, 200
  • Nó3 300, 300
  • Nó4 200, 400
  • Nó5 100, 500
  • Nó6 200, 600
  • Nó7 100, 700

Parece que cada nova criança num determinado nível distorce o resultado.Alguma idéia do que está acontecendo aqui?

Foi útil?

Solução

Depois de investigar o mapToItem método, concluí que não é a ferramenta certa para o trabalho, então escrevi o meu próprio.

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;
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top