2014-12-03 7 views
5
  1. C++ 코드의 어느 곳에서나 루트 객체 (아래 코드는 0을 반환, rootContext()->findChild()도 0을 반환 함)를 검색하는 방법 (클래스가 등록 된 QML 유형이고 클래스 구성 요소 정의는 루트의 직접적인 하위 항목입니다 (objectName 참조) 런타임에 생성 된 QQuickItem을 추가 하시겠습니까?
  2. myclass가 QML 유형으로 등록되었습니다. 최하위 코드를 사용하여 QML Button을 장면에 추가하는 방법은 무엇입니까? main.qml에서

(단편)Qt 5.3의 코드에서 QML 루트 객체 가져 오기

import QtQuick 2.3 
import QtQuick.Window 2.2 

Window { 
    objectName: root 

    visible: true 
    width: 360 
    height: 100 

    // ... 
} 

MyClass.cpp를

void myclass::add_hip() 
{ 
    setProperty("hip", 87); 

    QQmlEngine *engine = QtQml::qmlEngine(this); 

// QObject *root = engine->rootContext()->findChild<QObject*>("womanObj"); 
    QQuickWindow *window = qobject_cast<QQuickWindow *>(root); 
    QObject *wobj = window->findChild<QObject *>("womanObj"); 
    // 1. Define a QML component. 
    QQmlComponent *readHipComp = new QQmlComponent(engine); 
    readHipComp->setData("import QtQuick.Controls 1.2\n\ 
         Button {\n\ 
          anchors.top: addHipBtn.top\n\ 
          anchors.left: addHipBtn.left\n\ 
          anchors.margins: 3\n\ 
          text: \"Hip value\"\n\ 
          onClicked: {\n\ 
           msgDlg.text = myclass.hip\n\ 
           msgDlg.open()\n\ 
          }\ 
         }", QUrl()); 
    // 2. Create the component instance. 
    QQuickItem *readHipBtn = qobject_cast<QQuickItem *>(readHipComp->create()); 
    // 3. Add the instance to the scene. 
// readHipBtn->setParentItem(qobject_cast<QQuickItem *>(engine->rootContext()->contextObject())); 

// QObject *root = QtQml::qmlContext(this)->findChild<QQuickItem *>("root"); 
// readHipBtn->setParent(root); 
} 

UPDATE

extern QQuickWindow *window; 
void myclass::add_hip() 
{ 

    //... 
readHipBtn->setParentItem(window->contentItem()); 
//... 
} 

는 작동했지만 3)은 볼 수 없습니다 다른 main.qml 객체.

+0

당신이 "어디"무엇을 의미합니까? 어디서나 QML에? main.cpp 이외의 C++ 파일은 어디에서? –

+0

C++ 클래스 메서드 – programmist

답변

1

objectName은 필요하지 않습니다.

가져 오기 루트 요소와 그것이 윈도우의 확인 :

QQmlApplicationEngine engine; 
engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 
QObject *root = engine.rootObjects()[0]; 

QQuickWindow *window = qobject_cast<QQuickWindow *>(root); 
if (!window) { 
    qFatal("Error: Your root item has to be a window."); 
    return -1; 
} 
window->show(); 
+0

클래스가 등록 된 QML 유형이고 클래스 구성 요소 정의가 main.qml에있는 클래스 메소드에서 루트 창에 액세스하는 방법? – programmist