1

我有一个使用Qt 5.10商业版在iOSOSX上运行的Qt 应用程序。我有一个托管图像的QML 项目。当用户的手指在其上拖动或鼠标被拖动时,我正在尝试平移QML 项目。

以下是我试图使我的QML 项目可平移:

代码:

MyQmlItem {
    id: my_qml_item
    anchors.top: parent.top
    anchors.horizontalCenter: parent.horizontalCenter

    onXChanged: {
        if (my_qml_item_mouse_area.drag.active) {
            console.log("x = " + x)
            my_qml_item.x = // what to set x here to move my_qml_item wrt finger or mouse pressed movement
        }
    }
    onYChanged: {
        if (my_qml_item_mouse_area.drag.active) {
            console.log("y = " + y)
            my_qml_item.y = // what to set y here to move my_qml_item wrt finger or mouse pressed movement
        }
    }

    MouseArea {
        id: my_qml_item_mouse_area
        anchors.fill: parent

        drag {
            id: drag_area
            target: my_qml_item
            axis: Drag.XandYAxis
        }

    }
}

我了解我必须更新何时xy处于活动状态以及正在更新的位置。但我正在努力弄清楚我应该如何重新计算新的和MyQmlItemonXChangedonYChangedx ymy_qml_item.xmy_qml_item.y

问题:
我也正在获取xy更新。基本问题是,如何计算加上不断更新和。onXChangedonYChangedmy_qml_item.xmy_qml_item.y

有没有用于平移或拖动项目的 Qt/QML 的好例子QML

是否有某种方法可以通过仅设置默认值x和来复制以下锚点y?因为,它与拖动QML组件直接冲突

anchors.top: parent.top
anchors.horizontalCenter: parent.horizontalCenter
4

1 回答 1

2

如果您希望拖动锚点,则不应使用锚点,因为它链接了项目几何图形的某些部分。

在您的情况下,您只需要在特定时间建立特定位置,例如在应用程序启动时,因此您可以使用属性 "x"、"y"、"width" 和 "height" 而不是设置锚点。

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.2

ApplicationWindow {
    id: app
    visible: true
    visibility: "FullScreen"
    title: qsTr("Scroll")

    function resetPosition(){
        item.x = Screen.orientation === Qt.PortraitOrientation ? (Screen.width - item.width)/2 : (Screen.height - item.height)/2
        item.y = 0
    }

    Image {
        id: item
        source: "http://doc.qt.io/qt-5/images/declarative-qtlogo.png"
        onStatusChanged:  {
            if(status == Image.Ready)
                resetPosition()
        }
        MouseArea{
            anchors.fill: parent
            drag.target: item
            drag.axis: Drag.XAndYAxis
            onClicked: resetPosition()
        }

    }

    property bool isPortrait: Screen.primaryOrientation === Qt.PortraitOrientation || Screen.primaryOrientation === Qt.InvertedPortraitOrientation
    property bool isLandscape: Screen.primaryOrientation === Qt.LandscapeOrientation || Screen.primaryOrientation === Qt.InvertedLandscapeOrientation

    onIsPortraitChanged: resetPosition()
    onIsLandscapeChanged: resetPosition()
}
于 2018-02-06T19:00:33.143 回答