Я шучу с довольно простым образцом QML, который должен стать своего рода шахматной доской, но по какой-то причине я не могу правильно добавлять ячейки во время выполнения. Ячейка определяется с помощью ++ класса С (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
...
B 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"
}
}