2014-07-01 37 views
1

我在開玩笑地討論一個非常簡單的QML示例,它最終應該是某種棋盤,但由於某種原因,我無法在運行時正確添加單元。的小區是使用C++類(BasicCell延伸QQuickItem)中所定義,並且可以使用設爲Qml(cell.qml)設置樣式:不能在運行時通過QQmlComponent實例化

BasicCell { 
    width: 32 
    height: 32 
    Rectangle { 
     anchors.fill : parent 
     color : "green" 
    } 
} 

我使用QQmlComponent在運行時構建這種 「風格」 BasicCell的實例:

QQmlComponent cellComponent(qmlEngine(), cellUrl, this); 


// Make sure we could actually load that QML component 
if (cellComponent.status() != QQmlComponent::Ready) 
{ 
    std::cerr << "Error loading cell.qml:" << std::endl; 
    for (const auto& err : cellComponent.errors()) 
    { 
    std::cerr << " " << err.toString().toStdString() << std::endl; 
    } 
} 

for (int x = 0; x < mNumTiles.width(); ++x) 
{ 
    for (int y = 0; y < mNumTiles.height(); y++) 
    { 
    BasicCell* cell = qobject_cast<BasicCell*>(cellComponent.create()); 
    cell->setParent(this); 
    cell->setSize(QSize(tileSize(), tileSize())); 
    cell->setGridPos(QPoint(x, y)); 

    childItems().append(cell); 
    mCells.insert(cell->gridPos(), cell); 
    } 
} 

當使用QML調試器,我可以看到,我已經結束了與「正確」的層次結構:

Game 
    BasicCell 
    Rectangle 
    BasicCell 
    Rectangle 
    ... 

乙ut我看不到東西...我雙重和三重檢查:所有這些矩形和基本單元格都設置了適當的大小。

越來越沮喪,我最終複製了cell.qml的代碼,並將其作爲直接子代粘貼到Board.qml中。令我驚訝的是,這使得細胞完全如我所料。

我在使用QQmlComponent時與QML中的這種實例有什麼不同?

Game 
{ 
    // Should be created at runtime using QQmlComponent 
    BasicCell { 
     width: 32 
     height: 32 
     Rectangle { 
      anchors.fill: parent 
      color : "green" 
     } 
     gridPos: "0,0" 
    } 
} 

回答

1
cell->setParent(this); 

應該是

cell->setParentItem(this); 

視覺父的概念不同於QObject的 母體的不同。項目的可視父項可能不一定與其對象父項相同。有關更多 的詳細信息,請參閱Qt Quick中的Concepts - Visual Parent。

這是摘自:

http://qt-project.org/doc/qt-5/qquickitem.html#parent-prop

相關問題