2014-07-01 2 views
1

Я шучу с довольно простым образцом 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" 
    } 
} 

ответ

1
cell->setParent(this); 

должен быть

cell->setParentItem(this); 

Концепция визуального родителя отличается от родителя QObject . Визуальный родительский элемент может не совпадать с его родителем объекта . См. «Понятия» - «Визуальный родитель» в Qt Quick для получения более .

Это было взято из:

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

Смежные вопросы