如何在 NodeInstantiator Delegate 中访问组件?

How Access components inside NodeInstantiator Delegate?

我在 C++ 中有一个 line class,我想在 qml 中使用它。 我想用 鼠标 画一条线,并且有 多条线 。 其实我想new我的行class,所以我用NodeInstantiator.

 ListModel {
    id: entityModel

   }
 NodeInstantiator {
    id: instance

    model: entityModel

    delegate: Entity {
        id: sphereEntity

        components: [
            Line { id:lineMesh } ,

            PhongMaterial { id: material; ambient:"red" },

            Transform { id: transform;  }
        ]
    }
}

我的问题是我不能在 NodeInstantiator 之外使用其 id lineMesh 的线组件,而且我不知道如何生成线并将它们添加到它的 entityModel。

如果我不使用 NodeInstantiator ,当我用鼠标左键画线然后用右键画线时停止。然后在第二次,当我使用 左键我想要换行实体。

如图所示,现在我可以画线 一次。

这可能不是一个完整的答案,因为你的问题实际上有两个问题。但我认为它最终会对你有所帮助。

为了画一条线,您需要两个坐标。我建议在单击鼠标时存储当前坐标,并在发生下一次单击时,从存储的坐标到当前坐标(可能已更改)绘制一条线。然后,您可以使用 append 函数将项目添加到 ListModel

MouseArea {

    property var lastPoint : undefined

    onClicked: {
         if(lastPoint === undefined) //first click
         {
             lastPoint = {"x": mouse.x, "y": mouse.y}
         }
         else
         {
             entityModel.append({"startX": lastPoint.x,
                                 "startY": lastPoint.y,
                                 "endX": mouse.x,
                                 "endY": mouse.y});
             lastPoint = undefined
         }
    }
}

当然有一些变化,例如在 MouseArea 上使用 moved 信号在鼠标移动时插入实体,只要按下左键即可。我会把它留给你作为练习。

I Fixed My problem in CPP,也就是说我创建了一个class,它在我的程序中起到包装器的作用,它负责收集积分。 我 new 我的行 class 在这里 .

Qt3D NodeInstantiator存在一个bug:与ObjectModel一起使用会崩溃。因此,目前有一个明确的 ListModel。