程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在 Qt3D 中创建撤消/重做操作?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何在 Qt3D 中创建撤消/重做操作??

开发过程中遇到如何在 Qt3D 中创建撤消/重做操作?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何在 Qt3D 中创建撤消/重做操作?的解决方法建议,希望对你解决如何在 Qt3D 中创建撤消/重做操作?有所启发或帮助;

我在 QML 中使用 qt3d 创建了一些实体。例如,此代码显示了一个声明 Scene3DRootEntity 元素,Scene3D { ID : scene3d anchors.fill: parent focus: true aspects: ["render","logic","input"] hoverEnabled: true cameraAspectRatioMode: Scene3D.automaticAspectRatio antialiasing: true RootEntity { ID:root } } 是另一个包含场景图的 QML 元素:

Entity {
ID:root

property double x : 0.0


Camera {
    ID: mainCamera
    projectionType: CameraLens.PerspectiveProjection
    fIEldOfVIEw: 45
    aspectRatio: 16/9
    nearPlane : 0.1
    farPlane : 1000.0
    position: Qt.vector3d(0.0,4.49373,-3.78577)
    upVector: Qt.vector3d( 0.0,1.0,0.0 )
    vIEwCenter: Qt.vector3d(0.0,0.5,0.0)

}

OrbitCameraController
{
    ID: mainCameraController
    camera: mainCamera
}

components: [
    RenderSettings {

        VIEwport {
            normalizedRect: Qt.rect(0.0,0.0,1.0)
            RenderSurfaceSelector {
                CameraSelector {
                    ID: cameraSelector
                    camera: mainCamera
                    FrustumCulling {
                        ClearBuffers {
                            buffers: ClearBuffers.AllBuffers
                            clearcolor: "#444449"
                            NoDraw {}
                        }
                        LayerFilter {
                            filterMode: LayerFilter.discardAnyMatchingLayers
                            layers: [topLayer]
                        }
                        LayerFilter {
                            filterMode: LayerFilter.AcceptAnyMatchingLayers
                            layers: [topLayer]
                            ClearBuffers {
                                buffers: ClearBuffers.DepthBuffer
                            }
                        }
                    }
                }
            }
        }      
    },inputSettings {}
]

Layer {
    ID: topLayer
    recursive: true
}

ListModel {
    ID: entityModel
    ListElement { x:0;y:0;z:0 }
}

NodeInstantiator
{
    ID:instance

    model: entityModel

    delegate: Entity {
        ID: sphereEntity
        components: [
            SphereMesh
            {
                ID:sphereMesh
                radius: 0.3
            },phongMaterial
            {
                ID: materialSphere
                ambIEnt:"red"
            },transform {
                ID: transform
                translation:Qt.vector3d(x,y,z)
            }
        ]
    }
}

MouseDevice
{
    ID: mouseDev
}

MouseHandler
{
    ID: mouseHandler
    sourceDevice: mouseDev

    onpressed:
    {
        x++;
        entityModel.append({"x":x,"y":0.0,"z": Math.random()})
    }
}
}

RootEntity.qml

e1071

如何在 Qt3D 中创建撤消/重做操作?

在我的 Scene3D 中单击鼠标时,会显示一个球体。

我不知道如何通过按 Ctrl+ZCtrl+Shift+Z。 谢谢。

解决方法

一种方法是维护一个 Qt.vector3d 元素的全局列表,并使用它来记录使用“撤消”操作移除的球体的位置:

  • 当用户点击 CTRL+Z 时,创建一个新的 Qt.vector3d 对象来存储最后渲染的球体的位置(即最后附加到 entityModel) 并将该位置添加到 3d 矢量的全局列表中;
  • 然后,要从屏幕上移除一个球体,请使用需要擦除的球体的索引调用 entityModel.remove()

“重做”操作只是做相反的事情:

  • 当用户点击 CTRL+Y 时,全局 3d 向量列表的最后一个元素保存了最新移除的球体的位置:将此位置附加到 {{ 1}} 这样球体就可以再次渲染;
  • 然后,记得从全局列表中删除这个位置,以便下一个撤销操作可以渲染不同的球体;

RootEntity.qml

entityModel

大佬总结

以上是大佬教程为你收集整理的如何在 Qt3D 中创建撤消/重做操作?全部内容,希望文章能够帮你解决如何在 Qt3D 中创建撤消/重做操作?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: