在我的QML应用程序中,我需要常见的QGraphicsScene和QGraphicsObject可能性,例如检测碰撞,“可移动”和“可选”标志,拖放等。我应该从QQuickItem继承我的类还是使用QML Canvas?当然,我想编写更少的代码并选择“QML方式”。

最佳答案

对于QML中的冲突检测,您可以使用Box 2D QML插件。它具有很多好的功能,可以从here下载。

您也可以自行实现碰撞检测。例如,通过检查:

Math.sqrt((ball1.x-ball2.x)*(ball1.x-ball2.x)+(ball1.y-ball2.y)*(ball1.y-ball2.y))<epsilon

为了使QML项目可移动,您可以执行以下操作:
Image {
    id: icon
    width: 64
    height: 64
    source: "liverbird.gif"

    MouseArea {
        id: liverbirdMouseArea
        anchors.fill: parent

        property variant iconObj
        property int startX
        property int startY

        onPressed: {
            startX = mouseX
            startY = mouseY
            var iconComp = Qt.createComponent("icon.qml");
            iconObj = iconComp.createObject(parent);
            iconObj.x = mouseX - iconObj.width/2
            iconObj.y = mouseY - iconObj.height/2
        }
        onPositionChanged: {
            iconObj.x += mouseX - startX
            iconObj.y += mouseY - startY
            startX = mouseX
            startY = mouseY
        }
        onReleased: {
            iconObj.destroy()
        }
    }
}

07-24 14:38