2014-02-07 2 views
3

의 내가 사용자 지정 요소의 두 가지 유형이 있다고 가정 해 봅시다 장면은 내가 부모 클래스의 아이들을 모두 초기화 할로드 된 후 :QML 리피터 parentness

void InitializeChildren() { 
    list = findChildren<Child*>(QString(),Qt::FindChildrenRecursively); 
    foreach(Child * child,list) { 
     InitChild(this,child); 
} 

을하지만 그것을 더 복잡한 장면에서 실패합니다 :

Parent { 
    Rectangle { 
     Repeater { 
      model: 10 
      delegate: Child { 
      } 
     } 
    }  
} 

그냥 반복기에 하위 항목이 없습니다. 내 질문 - 특정 부모의 자식이 중첩 된 것을 정확히 알면 모든 하위 개체를 어떻게 얻을 수 있습니까? 당신은 또한 루트 QML 파일을로드하기 전에 setContextProperty을 할 필요가

QList<QObject*> m_childModel; 
void InitializeChildren() { 
    this->m_childModel.append(new Child("value 1")); 
    this->m_childModel.append(new Child("value 2")); 
    this->m_scene->rootContext()->setContextProperty("childModel", QVariant::fromValue(m_childModel)); 
} 

: 당신의 C++에서

Parent { 
    Rectangle { 
     Repeater { 
      model: childModel 
      delegate: Child { 
       Text { text: childValue } 
      } 
     } 
    }  
} 

:

답변

0

대신에 중계기를 분석 당신이 코드를 C++로 당신은 모델을 설정할 수 있습니다 .

그리고 Child 선언 :

class Child : public QObject 
{ 
    Q_OBJECT 

public: 
    Child(QString value) : m_value(value) {} 
    Q_PROPERTY(QString childValue READ getChildValue WRITE setChildValue NOTIFY childValueUpdated) 
    // Other properties... 

    QString getChildValue() const { return m_value; } 
    void setChildValue(const QString &value) 
    { 
     if (value == m_value) 
      return; 
     m_value = value; 
     emit childValueUpdated(); 
    } 

signals: 
    void childValueUpdated(); 

private: 
    QString m_value; 

} 
+2

답장을 보내 주셔서 감사합니다. @Kirween. C++이 아닌 QML에서 유연한 구조를 만드는 것이 목적입니다. 새 자식 추가는 중첩 된 블록으로 공통 QML 스타일의 사용자에게 투명해야합니다. 자식은 Rectangle item 또는 다른 QML 노드 안에있을 수 있습니다. 그러나이 모든 요소는 반드시 부모의 자녀이며 반드시 부모의 직접적인 자녀는 아닙니다. 자식 노드 일 수 있습니다 ...이 힙에서만 가져와야합니다 자식 노드가 있지만 모두 해당 – folibis

+1

이 문제점에 대한 업데이트는 있습니까? 나는 같은 문제를 겪고있다. –

+0

+1 나는이 문제를 너무 가지고있다. .. – Avio

1

좋아, 내가 그것을 알아 냈 : 더 이상 사용할 수 없습니다 리피터 어린이 findChildren()를 사용하게 Qt5의 변화가 있었다 . qquickrepeater.cpp를 살펴본 후 Repeater는 생성 된 자식 대리자에 QQuickItem :: setParentItem()을 호출합니다. 따라서 원래의 부모와 자녀는 손길이 닿지 않지만 "시각적 인"부모는 중계기의 부모입니다.

TLDR : Qt5에서 findChildren()을 사용하여 항목 장면 그래프를 탐색하지 마십시오.

QList<SearchType *> list; 
getAllSearchTypes(rootItem, list); 
// list now contains all obects of type SearchType, recursively searched children of rootItem 

당신이 찾고있는 C++ 유형 searchType이를 교체 대신, 다음과 같이 사용합니다

void getAllSearchTypes(QQuickItem *parent, QList<SearchType *> &list) { 

QList<QQuickItem *> children = parent->childItems(); 
    foreach (QQuickItem *item, children) { 
    SearchType *searchObject = dynamic_cast<SearchType *>(item); 
    if (seachObject) list.append(searchObject); 
    // call recursively and browse through the whole scene graph 
    getAllSearchTypes(item,list); 
} 
} 

을 그리고 그와 같은 함수를 호출합니다.

참고 : findChildren()과 관련된 변경 사항은 children()이 아니라 childItems()를 호출해야한다는 것입니다. 이상적으로 QQuickItem에 template 함수가있을 것입니다. 예를 들어 findChildItems()는 미래의 Qt 버전에서 템플릿 내부에 위의 재귀 적 검색을 수행합니다.

+0

+1 감사합니다. 완벽하게 작동했습니다. 나는 이것보다 더 좋은 방법이 없다고 생각한다. 아마 이것은 받아 들여진 응답이어야합니다 ... – Avio