无法通过QQmlComponent在运行时明显实例化

时间:2014-07-01 18:25:02

标签: c++ qt qml

我正在开玩笑的一个非常简单的QML样本应该最终成为某种棋盘,但出于某种原因,我无法在运行时正确添加单元格。使用C ++类(BasicCell扩展QQuickItem)定义单元格,并使用Qml(cell.qml)进行样式设置:

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调试器时,我可以看到我最终得到了&#34;正确的&#34;层次结构:

Game
  BasicCell
     Rectangle
  BasicCell
     Rectangle
  ...

但我无法看到一件事......我进行了双重和三重检查:所有这些矩形和基本单元都设置了合适的尺寸。

越来越沮丧,我终于从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 个答案:

答案 0 :(得分:1)

cell->setParent(this);

应该是

cell->setParentItem(this);
  

可视父级的概念与QObject的概念不同   家长。项目的可视父母可能不一定与其相同   对象父母。有关更多信息,请参阅概念 - Qt Quick中的Visual Parent   的信息。

取自:

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