QML MouseArea属性不处理“目标”

时间:2018-01-03 16:00:14

标签: qt qml qt-quick qqmlcomponent mousearea

我们有一个项目,其中有一些组件,其中一个名为Racket.qml,如下所示:

import QtQuick 2.9

Rectangle {
    id: root
    width: 15; height: 65
    property int oldY: y
    property bool yUwards: false
    property bool yDwards: false

    onYChanged: {
        if(y > oldY)  yDwards = true
        else if (y < oldY)  yUwards = true
        oldY = y
    }

    Item {
        x: root.x - 50
        y: root.y - 50
        width: 100
        height: 200

        MouseArea {
            anchors.fill: parent
            drag.target: root
            focus: true
            hoverEnabled: true
            pressAndHoldInterval: 0
            drag.axis: Drag.YAxis
            drag.minimumY: table.y
            drag.maximumY: table.height - height - 10
        }
    }
}

我以main.qml这种方式使用了该组件:

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

Window {
    id: window
    title: qsTr("Test")
    color: "gray"

    Rectangle {
        id: table
        width: window.width / 1.15; height: window.height / 1.15
        x: window.x + 100; y: 10;

        Racket {
            id: blackRacket
            anchors.left: table.left
            anchors.leftMargin: width * 2
            y: height
            color: "black"
        }
        Racket {
            id: redRacket
            anchors.right: table.right
            anchors.rightMargin: width * 2
            y: height
            color: "red"
        }
      ...

我的目的只是扩大球拍区域,但现在当我运行该程序时,我无法拖动球拍!

问题是什么?

1 个答案:

答案 0 :(得分:0)

要进行调试,请为Rectangle添加带有彩色边框的透明MouseArea

MouseArea {
    anchors.fill: parent
    drag.target: root
    focus: true
    hoverEnabled: true
    pressAndHoldInterval: 0
    drag.axis: Drag.YAxis
    drag.minimumY: table.y
    drag.maximumY: table.height - height - 10
    Rectangle {
        anchors.fill: parent
        color: 'transparent'
        border.color: 'black'
    }
}

您会看到MouseArea被错误放置。也就是说,因为Item的位置相对于Rectangle并且使用xy坐标。将Item的{​​{1}}和x直接设置为y即可解决问题(第17,18行)。

然而,该项目完全冗余且性能降低。您可以直接更改-50的大小和位置以减少开销。您也可以通过使用负边距锚定来完成此操作。有点像:

MouseArea