QML 파일 자체가 여러 개의 QML 항목 (개별 파일로 구성)을 표시하는 QQuickView
이 있습니다. C++ 코드를 사용하여 항목을 동적으로 추가하고 싶습니다. 동적으로 추가 된 항목은 상위 항목 (예 : width
및 height
속성 참조 상위)과 크기를 조정해야합니다. 예를 들어동적으로 C++ 생성 QML 항목이 다른 기존 항목을 인식하지 못하는 이유는 무엇입니까?
는 QML 내 대상 항목은 다음과 같습니다가 :
// TargetContainer.qml
Grid {
id: fillMeWithItemsContainer
objectName: "fillMeWithItemsContainer"
}
나는 동적으로 (아마도 여러 번) 추가 할 항목과 같습니다
// DynamicItem.qml
Rectangle {
color: "white"
height: fillMeWithItemsContainer.height
width: height * 4/3
}
참고 그 직사각형은 높이와 관련된 컨테이너를 참조합니다.
quickView
는 TargetContainer
로 채워집니다 :
QQuickView *quickView = new QQuickView();
quickView->setSource(QUrl("qrc:/foo/bar/TargetContainer.qml"));
그래서 나는 구성 요소
QQmlComponent dynamicallyLoadedComponent(
quickView->engine(),
QUrl("qrc:/foo/bar/DynamicItem.qml")
);
를로드 그리고 나는 그것의 개체를 만들 수 있습니다. 그것은 이전에 생성되어 있기 때문에,
DynamicItem.qml:4: ReferenceError: fillMeWithItemsContainer is not defined
quickView
fillMeWithItemsContainer
의 존재를 알고 있어야합니다
QObject *dynamicallyLoadedObject = dynamicallyLoadedComponent.create();
여기에 내가 (응용 프로그램 출력보기에서) 오류를 얻을. 그러나
fillMeWithItemsContainer
은 (아직)
dynamicallyLoadedObject
의 부모가 아니며 문제가 될 수 있습니다.
QObject
(내가 전에
dynamicallyLoadedObject->setParent()
을 시도하지만, 이것은 부모의 다른 종류의 것 같다 :
그래서 나는
QQuickItem *targetItem = quickView->rootObject()->findChild<QQuickItem*>("fillMeWithItemsContainer");
하여 대상 항목을 찾아 이전에 생성 된 객체를
dynamicallyLoadedObject->setProperty("parent", QVariant::fromValue<QObject*>(targetItem));
참고 reparent 대 부모 재산).
그러나 dynamicallyLoadedObject
의 너비 및 높이 속성은 0으로 설정됩니다 (참조 오류로 인해). 변경되지 않습니다. 프로그래밍 방식으로 다시 설정하더라도
dynamicallyLoadedObject->setProperty("height", "fillMeWithItemsContainer.height;");
dynamicallyLoadedObject->setProperty("width", "height * 4/3");
아무 것도 변경되지 않습니다.
나는 그것이 작동 직접 QML에서 DynamicItem을 정의하는 경우 :
Grid {
id: fillMeWithItemsContainer
objectName: "fillMeWithItemsContainer"
DynamicItem {}
}
가 어떻게 동적으로 추가 된 항목은 전에 QML보기에 된 항목에 액세스 할 수 있는지 확인합니까? 대안 : 내가 뭘 잘못하고 있니?
캐스팅은 무의미합니다. QQmlComponent :: create()는 올바른 유형의 개체를 만듭니다.이 개체는 QQuickItem의 하위 클래스입니다. 이 포인터를 캐스팅하면 어떤 식 으로든 타입이 변경되지 않고 QQuickItem을 유지합니다. –
@tmcguire 수정 해 주셔서 감사합니다. 이 경우 DynamicObject 인스턴스 포인터를 QObject로 캐스팅하는 것은 적합하지 않습니다. (나는 컨텍스트 속성을 엉망으로 만들었다.) –