Прикрепите и отсоедините прямоугольник к движущемуся прямоугольнику в QML - PullRequest
0 голосов
/ 04 мая 2020

Я хочу реализовать в , что, пока я удерживаю кнопку, два прямоугольника перемещаются вместе, но как только я отпускаю ее, один из прямоугольников остается там, где он был в данный момент выпуска.

Пусть движущийся Rectangle будет мастером, а его код будет следующим:

Rectangle {
    id: master
    x: 10
    y: 10
    width: 50
    height: 50
    color: "#00ff00"

    Behavior on x {
        NumberAnimation {
            duration: 2000
        }
    }
}

Код ведомого, который должен двигаться вместе с мастером, пока кнопка удерживается следующим образом:

Rectangle {
    id: slave
    x: 100
    y: 100
    width: 50
    height: 50
    color: "#ff0000"
}

В настоящее время я предпринял следующую попытку присоединить и отсоединить ведомое устройство к мастеру:

ToggleButton {
    id: attach
    x: 300
    y: 300
    text: qsTr("Attach")

    onClicked: {
        if (checked) {
            slave.parent = master
        } else {
            slave.parent = mainWindow
        }
    }
}

Проблема заключается в том, что если мастер уже перемещается, нажатие кнопки переводит подчиненное устройство в положение, в котором оно находилось бы, если бы оно перемещалось с ведущим с самого начала, а затем продолжает перемещаться вместе с ведущим даже после отпускания кнопки.

Как могу ли я произвольно прикрепить другие объекты к движущимся объектам, а затем отсоединить их в ?

1 Ответ

1 голос
/ 04 мая 2020

Ваш подход к подключению раба в качестве дитя хозяина и вызывает прыжок. Как только ведомое устройство переопределяется, его x и y, равные 100, размещают его там относительно его нового родителя master, а не там, где он был относительно mainWindow.

Когда вы переопределяете его, вам необходимо установите значения x и y ведомого относительно master, чтобы они были переводом x и y из системы координат главного окна в систему координат master. Посмотрите на Item::mapFromItem и Item::mapToItem, чтобы увидеть, как перевести ведомое x и y из 100 в контексте mainWindow в ту же физическую позицию на экране, но с точки зрения нового родителя master.

Обратите внимание, что вам нужно будет сделать то же самое в обратном порядке, когда вы остановите перетаскивание и переотобразите ведомого обратно в главное окно.

Вот пример некоторых обновлений кода:

ToggleButton {
    id: attach
    x: 300
    y: 300
    text: qsTr("Attach")

    onClicked: {
        if (checked) {
            var newPoint = mainWindow.contentItem.mapToItem(master, slave.x, slave.y);
            slave.parent = master;
            slave.x = newPoint.x;
            slave.y = newPoint.y;
        } else {
            var newPoint = master.mapToItem(mainWindow.contentItem, slave.x, slave.y);
            slave.parent = mainWindow.contentItem;
            slave.x = newPoint.x;
            slave.y = newPoint.y;
        }
    }
}
...