2017-09-13 6 views
0

예. 자식의 초기화 순서가 소스 코드에 나타나는 순서와 일치하는지 보장합니까?Qt Quick children의로드 순서가 지정되어 있습니까?

참고 : "자식 초기화"란 "자식 및 모든 자식, 하위 항목, 바인딩 등의 초기화"를 의미합니다.

+0

개체가 순서대로 만들어지는 나무입니다. 바인딩의 경우 보증이 없으며 순서는 임의적입니다. 별도의 단계에서 발생하며 표현식 계층에 따라 여러 번 걸릴 수 있습니다. 일반적으로 루트 객체의 전체 QML 파일보다 미세한 입자에 의존해서는 안됩니다. 순서에 대한보다 강력한 제어를 원한다면 반드시 명령형으로 트리를 인스턴스화하십시오. – dtech

+0

@dtech : "개체가 순서대로 생성되었습니다." -하지만 * 주문은? :) –

+0

자연스럽게 나무의 순서, 뿌리부터 잎까지. 특정 구현을 모르지만 일반적인 논리는 트리를 반복하고 모든 객체를 생성하고 부모로 사용할 현재 분기 객체를 푸시하고 팝핑하도록 지시합니다. 부모가 만들어지기 전에 아이들이 만들어지고 나서 부모가 만들어 질 가능성은 희박합니다. – dtech

답변

1

간단한 테스트를 통해 개체 생성 순서를 확인할 수 있습니다. 그런 다음

class Test : public QQuickItem { 
    Q_OBJECT 
    public: 
    Test(QQuickItem * p = 0) : QQuickItem(p) { qDebug() << this; } 
}; 

:

의 출력을 제공
Test { 
    objectName: "a" 
    Component.onCompleted: console.log(objectName, this) 
    Test { 
     objectName: "b" 
     Component.onCompleted: console.log(objectName, this) 
     Test { 
     objectName: "c" 
     Component.onCompleted: console.log(objectName, this) 
     } 
     Test { 
     objectName: "d" 
     Component.onCompleted: console.log(objectName, this) 
     } 
    } 
    Test { 
     objectName: "e" 
     Component.onCompleted: console.log(objectName, this) 
    } 
    } 

: 해당 객체의 생성자가 실제로 맨 아래라고 표시

Test(0x6a7378, parent=0x0, geometry=0,0 0x0) 
Test(0x6a73d8, parent=0x0, geometry=0,0 0x0) 
Test(0x6a7438, parent=0x0, geometry=0,0 0x0) 
Test(0x6a7498, parent=0x0, geometry=0,0 0x0) 
Test(0x6a74f8, parent=0x0, geometry=0,0 0x0) 
qml: a Test(0x6a7378, "a") 
qml: e Test(0x6a74f8, "e") 
qml: b Test(0x6a73d8, "b") 
qml: d Test(0x6a7498, "d") 
qml: c Test(0x6a7438, "c") 

합니다.

또한 핸들러가 설치된 위치에 따라 onCompleted의 순서가 다릅니다. 이 같은 Obj.qmlTest을 포장하는 경우 :

Test { 
    id: rectangle 
    Component.onCompleted: console.log(objectName, this) 
} 

을 그리고이 같은 구조 선언

Obj { 
    objectName: "a" 
    Obj { 
     objectName: "b" 
     Obj { 
     objectName: "c" 
     } 
     Obj { 
     objectName: "d" 
     } 
    } 
    Obj { 
     objectName: "e" 
    } 
    } 

그런 다음 당신이 얻을하지 않았다 출력 "다시 전면에"일관된 수를 첫 번째 시나리오 : 그러나

Test(0x4b2458, parent=0x0, geometry=0,0 0x0) 
Test(0x4b24b8, parent=0x0, geometry=0,0 0x0) 
Test(0x4b2518, parent=0x0, geometry=0,0 0x0) 
Test(0x4b2578, parent=0x0, geometry=0,0 0x0) 
Test(0x50f9d68, parent=0x0, geometry=0,0 0x0) 
qml: e Test(0x50f9d68, "e") 
qml: d Test(0x4b2578, "d") 
qml: c Test(0x4b2518, "c") 
qml: b Test(0x4b24b8, "b") 
qml: a Test(0x4b2458, "a") 

는이 모든 다른 물건을 잔뜩 포함 객체 생성의 순서가 아닌, 완료 객체, 실행 할 수 있습니다 반영 d는 바인딩 표현 구조에 따라 임의의 순서로 표시됩니다.

간단히 말해서, 그 순서에 정말로 의존해서는 안됩니다. 그렇게한다면, 잘못하고있는 것입니다. 전체 QML 소스 트리 완성보다 더 미세한 것에 의존해서는 안되며, qtquick 엔진 자체는 전체 객체 트리가 완료 될 때까지 초기화 바인딩 표현 등을 지연 처리하므로 문제가되지 않습니다. 즉, 자동으로 발생하지만 더 낮은 레벨의 세밀한 요소에 의존하는 것은 디자인의 잠재적 인 결함이며 피해야합니다. 객체 ID를 부여하고 초기화의 더 명확한 순서를 원할 경우 물건을 연결하는 전체 qml 파일에 대해 하나의 초기화 표현식을 실행합니다. 해당 표현식의 명령문은 정의 된 순서대로 실행됩니다.

+0

* [...] 당신은 그 순서에 정말로 의존해서는 안됩니다. [...] * 그 순서는 누군가가 속성을 통해 어린이를 노출하는 것을 잊었을 때 흥미 롭습니다. 그리고 생성 된 순서대로이 목록에 추가되는 자식 children (index)에 액세스해야합니다 (부모가 나중에 부모가되는 경우는 제외). 스타일'QtQuick.Controls 1.x'-Objects 소스 코드로 이동하면이 목록의 어느 위치에서 속성을 변경하려는 부분을 쉽게 찾을 수 있는지 항상 알 수 있습니다. – derM

+0

이것은 "안정적인"인터페이스로 간주되지 않습니다. 개인적으로 그렇게하지 않을 것입니다. 그 순서는 여러 가지 이유로 바뀔 수 있습니다. 차라리 제어 소스를 복사하고 내가 필요한 물건을 인터페이스하고 싶습니다. – dtech

+0

나는 그것이 더 이상 유지되지 않는다는 것을 알고있는 한 안정적인 인터페이스라고 생각할 것이다. 그래서 변경은 거의 없을 것이다. 이렇게 말하자 : 충분히 안정적이다. – derM