2015-08-08 216 views
1

如何從C++中動態添加更多Rectangle到ID爲root的那個?例如,兩個Rectangle有色red和​​?從C++向QML佈局添加對象

main.qml:

Rectangle { color: "red"; width: 200; height: 200 } 
Rectangle { color: "green"; width: 200; height: 200 } 

Qt創建者生成main.cpp

int main(int argc, char *argv[]) { 
    QGuiApplication app(argc, argv); 
    QtQuick2ApplicationViewer viewer; 
    viewer.setMainQmlFile(QStringLiteral("qml/gui/main.qml")); 
    viewer.showExpanded();  
    return app.exec() 
} 

回答

3

的最佳方式來創建動態

Rectangle { 
    id: root 
} 

典型QML對象下 '根' 添加項目是QML本身。但是如果你仍然想用C++來做到這一點,那也是可能的。例如:

main.cpp中:

int main(int argc, char *argv[]) 
{ 
    QGuiApplication app(argc, argv); 
    QQuickView view; 
    view.setSource(QUrl("qrc:/main.qml")); 
    view.show(); 
    QObject *root = view.rootObject(); 
    QQuickItem * myRect = root->findChild<QQuickItem *>("myRect"); 
    if(myRect) { 
     QQmlComponent rect1(view.engine(),myRect); 
     rect1.setData("import QtQuick 2.4; Rectangle { width:100; height: 100; color: \"orange\"; anchors.centerIn:parent; }",view.source()); 
     QQuickItem *rect1Instance = qobject_cast<QQuickItem *>(rect1.create()); 
     view.engine()->setObjectOwnership(rect1Instance,QQmlEngine::JavaScriptOwnership); 
     if(rect1Instance) 
      rect1Instance->setParentItem(myRect); 
    } 
    return app.exec(); 
} 

main.qml

import QtQuick 2.4 

Item { 
    width: 600 
    height: 600 

    Rectangle { 
     objectName: "myRect" 
     width: 200 
     height: 200 
     anchors.centerIn: parent 
     color: "green" 
    } 
} 

因爲所有的QML項目都有相應的С++類,它可以直接創建QQuickRectangle但標題是私人的,這不是建議的方式。

此外,請注意,我使用objectName訪問C++項目,而不是id,因爲它在C++端不可見。