Search code examples
c++qtqmlqt-quickqgraphicsscene

Add qml object to QGraphicsScene


I try to add some QML object to my QGraphcisScene but they don't display in the scene. Here is the code.

QList<QObject*> dataList;
dataList.append(new DataObject("Item 1", "red"));
dataList.append(new DataObject("Item 2", "green"));


QDeclarativeEngine engine ;
QDeclarativeContext *context = engine.rootContext();
context->setContextProperty("myModel", QVariant::fromValue(dataList));
QUrl url("qrc:view.qml") ;
QDeclarativeComponent component(&engine,url ) ;
QDeclarativeItem *item = qobject_cast <QDeclarativeItem *>(component.create());
item->setFlag(QGraphicsItem::ItemHasNoContents, false);
myScene->addItem(item);

And here is my qml file:

ListView {
    width: 100; height: 100

    model: myModel
    delegate: Rectangle {
        height: 25
        width: 100
        color: model.modelData.color
        Text { text: name }
    }
}

Solution

  • You can add a QML in a QDeclarativeView to your scene using addWidget:

    QDeclarativeView view;
    view.setSource( QUrl("qrc:view.qml"));
    view.setStyleSheet("background-color:transparent");
    QGraphicsProxyWidget * item = myScene->addWidget((QWidget *)view);
    

    For QtQuick 2.0 you can embed QQuickView in a widget using createWindowContainer :

    QQuickView *view = new QQuickView();
    ...
    
    QWidget *container = QWidget::createWindowContainer(view);
    container->setMinimumSize(...);
    container->setMaximumSize(...);
    container->setFocusPolicy(Qt::TabFocus);
    QGraphicsProxyWidget * item = myScene->addWidget((QWidget *)container);