我在開玩笑地討論一個非常簡單的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"
}
}