2012-12-30 6 views
6

다음과 같은 문제가 있습니다. 파일을 사용하여 QQuickView에 초기 인터페이스를로드합니다. 그런 다음 Image 또는 Text과 같은 QML types을 C++을 사용하는 인터페이스에 추가하려고합니다.C++로 QML 요소를 만드시겠습니까?

저는 C++의 기존 요소를 조작 할 수 있지만 어떻게 새로운 유형을 만들고 추가 할 수 있습니까?

답변

10

는 불행하게도 문서는 약간 밖으로 오래된 (QT4 API를 사용),하지만 당신은 여기에 C++에서 섹션 로드 QML 구성 요소를 읽을 경우 https://doc.qt.io/qt-4.8/qtbinding.html

그럼 당신은 (와 Qt5 API를 같은 것을해야한다) :

QQuickView view; 
view.setSource(QUrl::fromLocalFile("MyView.qml")); 
QQmlComponent component(view.engine() 
     , QUrl::fromLocalFile("MyItem.qml")); 
QObject *object = component.create(); 

이 당신에게 .qml 파일에서있는 QObject를 제공하지만, 무엇을 누락하는 것은보기에 이것을 추가하는 방법입니다. qml에서 항목을보기에 부모로 지정하지 않으면 항목이 그려지지 않습니다.

또한
QQmlProperty::write(object, "parent" 
        , QVariant::fromValue<QObject*>(view.rootObject())); 

, 메모를 (다시 위의 링크에서) :이 일을하는 한 가지 방법은과 같이, 루트 컨텍스트에 항목을 추가하는 것입니다 "당신은 항상 사용해야 QObject를 : setProperty는(), QDeclarativeProperty 또는 QMetaProperty :: write()를 호출하여 QML 엔진이 속성 변경 "을 인식하도록합니다.

다음으로 항목의 소유권을 설정해야합니다. 그렇지 않으면 JavaScript 가비지 핸들러가 항목을 삭제할 수 있으며 임의로 오류를 분류 할 수 있습니다.

QQmlEngine::setObjectOwnership(object, QQmlEngine::CppOwnership); 

마지막으로 개체 "개체"를 삭제해야합니다. QObject이기 때문에 다음을 사용해야합니다.

object->deleteLater(); 

누군가를 돕는 희망! 여기

+1

가져 오기를 잊지 마십시오 Alan

1

이동 : http://qt-project.org/doc/qt-5.0/qtqml/qtqml-cppintegration-definetypes.html는 하단으로 스크롤 제목 당신에게 그것을 할 방법 아이디어를 제공

"는 QtQuick 모듈과 비주얼 항목을 정의」을 봐주세요.

이 링크는 수행 방법을 예를 제공한다 (이것은 Qt는 4.7를 위해 작성되었습니다 생각을하지만, Qt는 5 다르지 안) : http://developer.nokia.com/Community/Wiki/Creating_a_custom_QML_element_with_Qt


참고 :하지 마십시오 잊지 (상속) QQuickItem QDeclarativeItem 대신 클래스.