개체의 위치를 바꿈 나는 객체의 트리를 생성, 나무는 아주 간단한 논리를 사용하여 그려진 :버기 결과, 삽입
- 각 개체는 자신의 표현처럼 큰 플러스 아이의 (등 자녀와 ...)
- 는 개체마다 다음 개체가 이전 형제의 바로 아래에 그려진
- 그것의 시각적 표현에서 들여 그려 부모의 첫 번째 자식 인 경우
그러나이 간단한 알고리즘은 새로운 개체를 삽입 할 때 실패합니다. 예를 들어
이때는, 노드 1 및 2가 성공적으로 자신의 UI의 합인 노드 0 (모든 노드의 좌측 검은 선)의 전체 높이와 노드 0에 삽입 그리고 그 두 자녀 모두.
노드 3을 노드 1에 삽입하면 레이아웃이 끊어집니다 - 노드 2는 아래로 밀리지 않습니다. 결과적으로 새로 삽입 된 노드와 겹치기 때문에 검은 선이 보이지 않습니다.
새로 고침주기가 트리거되면 트리가 정상 상태로 돌아가므로 일부 임시 "또는 동기화"속성으로 인해 글리치가 발생해야합니다. 하나의 추가 새로 고침이 트리를 순서대로 배치하지는 않습니다. 삽입 위치에 따라 버그가 때때로 리프레시 사이클을 거쳐 정렬을 방해하지 못하도록 "캐스케이드 아웃"됩니다.
이 비정상적인 동작 및/또는 해결 방법은 무엇입니까? 코드가 가끔씩 중단되는 이유는 무엇이며 궁극적으로 작동하더라도 순차적으로 실행 되려면 여러 번 새로 고침해야합니다.
편집 : 레벨에서 마지막 노드로 끝나지 않는 노드에 삽입 할 때 정렬이 중단되는 시점을 찾아 내고 찾아 낼 수있었습니다. 모든 새로운 바인딩이 마지막이고 "열린"노드에 삽입되는 한 모든 바인딩은 올바르게 전달됩니다. 해당 레벨에는 다음 노드가 없지만 이전 노드에 삽입하면 바인딩이 중단됩니다. 따라서 버그가 영향을 미치는 모든 레벨을 통해 버그를 단계적으로 제거하려면 추가 새로 고침주기가 필요합니다. 그러나 나는 그것이 발생했을 때만 그것을 일으키는 원인과 그것을 고치는 방법을 아직도 모른다.
EDIT : 좀 더 자세히 살펴보면 새 항목을 부모 항목에 삽입하고 해당 항목의 순서에 따라 해당 항목을 다시 정렬 한 후 부모 항목의 childrenRect
속성이 오른쪽의 크기 변경 내용을 반영하지 않는 것으로 보입니다. 떨어져. 따라서 삽입 된 객체의 다음 형제가 배치 될 때 객체 높이에 대해 오래된 오래된 값을 사용합니다. 객체 높이를 사용하지 않으므로 새로 삽입 된 객체에 영향을 미치지 않습니다. 그래서 다음 큰 질문은 올바른 데이터로 알고리즘이 예상대로 작동 할 수 있도록 바인딩을 수행하도록 수정하는 것입니다. 타이머를 사용하여 작업을 지연 시키려고했지만 시간 문제는 아니지만 논리적 순서와 관련되어있는 것으로 보입니다. 그것이 발생한 부서와 동일한 버그를 제거하기 위해 현재 필요한 새로 고침 횟수.
EDIT : "해결 방법"을 알았지 만, 실제로는 그 원인과 회피 방법을 알 수 없지만 전체 트리를 업데이트하는 것보다 "경제적 인"해결책이 될 때까지 부모에게 내려 가서 root에 도달 할 때까지 현재 브랜치 만 업데이트하면됩니다. 이것은 많이 저장하지 않지만 바인딩이 작동하기 때문에 올바른 값을 가지고있는 것을 선호합니다. 최소한 IMO 이상입니다.
편집은 다음 QML 설정 방법
for (int i = 0; i < _children.size(); ++i) {
UI * ui = _children.at(i)->_ui;
if (ui) {
if (i) {
UI * prev = _children.at(i-1)->_ui;
ui->setX(prev->x());
ui->setY(prev->height() + prev->y());
} else {
ui->setX(Object::_helper->nodeSize());
ui->setY(_ui->childOffset());
}
}
}
그리고 예 : 당신이 그것에 대해 생각할 때, 그 행동이 완벽한 의미가
UI {
id: main
width: childrenRect.width
height: childrenRect.height
Item {
height: childrenRect.height
Rectangle {
width: Helper.nodeSize
height: Helper.nodeSize
color: "red"
Text {
anchors.centerIn: parent
text: main.id
}
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton
onClicked: {
if (mouse.button == Qt.RightButton)
Helper.gotoXY(main.absolutePosition())
else {
Helper.createObject(1, main)
Helper.updateRoot()
}
}
Rectangle {
height: main.height
width: 10
x: -10
color: "black"
}
}
}
}
}
나는 문제와 관련된 코드와 목업이 천 단어의 가치가 있다고 생각한다. :) – lpapp
@ LaszloPapp - 질문을 약간 업데이트했습니다. 두 문제와 일부 코드가 추가되었습니다. –
QML 코드를 더 추가 할 수 있습니까? 예를 들어, id가'childrenRect' 인 요소. –