Mapeamento de coordenadas para item que não funciona conforme esperado
-
21-12-2019 - |
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:
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?
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;
}