2014-04-23 49 views
2

我嘗試添加一些QML對象到我的QGraphcisScene,但它們不顯示在場景中。這是代碼。添加qml對象到QGraphicsScene

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); 

這裏是我的QML文件:

ListView { 
    width: 100; height: 100 

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

在QML文件的請求處添加'import QtQuick 1.0'並檢查日誌內容(必須有一些錯誤報告)。 –

+0

@MarekR qDebug()<< component.errors()給()如果我檢查myScene-> items()。size(),它會顯示添加了一些項目。 –

+0

@MarekR Btw,我們不能使用QgraphicsScene的QtQuick2.0嗎? –

回答

3

您可以在QDeclarativeView到場景中使用添加QML addWidget:

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

對於QtQuick 2.0可以嵌入QQuickView在使用小工具createWindowContainer

QQuickView *view = new QQuickView(); 
... 

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

感謝您的回答。如果我是對的,這是一個QtQuick 1.0解決方案。是否有QtQuick 2.0解決方案?此外,用QML實現我的接口的一部分是一個好主意,因爲我有QGraphicsView的主要部分? –

+0

是的,它適用於QtQuick 1.0。我已經更新了QtQuick 2.0的答案。 – Nejat

+0

嘗試了這一點,但它打開一個新窗口,旁邊是包含qgraphicsscene的主窗口旁邊的QML。 –