#qt #qml
#qt #qml
Вопрос:
Как мне правильно изменить x, y объекта, чтобы он менял свое положение при изменении размера родительского объекта? Существует, я представлю, что если я перетащу прямоугольник в середину, то при изменении размера окна он должен оставаться в середине. (только в середине, например, прямоугольник можно перемещать свободно)
import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.3
Window {
visible: true
width: 640
height: 480
onWidthChanged: {
block.x -= block.previousWidth - width
block.previousWidth = width
}
onHeightChanged: {
block.y -= block.previousHeight - height
block.previousHeight = height
}
Rectangle {
id: block
color: "red"
width: 50
height:50
x: 100
y: 50
property int previousWidth: 0
property int previousHeight:0
Component.onCompleted: {
previousWidth = parent.width
previousHeight = parent.height
}
MouseArea {
anchors.fill: parent
drag.target: block
}
}
}
Комментарии:
1. Пожалуйста, объясните ваш вариант использования с некоторыми изображениями.
2. Лучшим и правильным решением является использование привязки . QML — это декларативный язык, вам не следует применять некоторые императивные методы. Позвольте движку выполнить работу, просто объясните, что вы хотите получить.
3. @folibis, прямоугольник можно свободно перемещать , поэтому привязка, я думаю, не сработает.
Ответ №1:
Должен признаться, сначала вопрос меня не впечатлил. Однако, когда я подумал об этом, это представляет собой очень интересный и допустимый вариант использования. Поэтому я был бы рад предоставить решение.
Решение
Я бы подошел к проблеме так:
- Сделайте фрейм дочерним элементом фонового изображения.
- Вместо ручного вычисления координат используйте
Item.scale
для масштабирования изображения, эффективно сохраняя относительное положение рамки относительно изображения.
Пример
Вот пример, который я подготовил для вас, чтобы продемонстрировать, как можно реализовать предлагаемое решение:
import QtQuick 2.15
import QtQuick.Window 2.15
Window {
visible: true
width: 640
height: 480
Image {
anchors.centerIn: parent
source: "alphabet.png"
scale: parent.width/sourceSize.width
Rectangle {
id: frame
width: parent.width/7
height: parent.height/4
border.color: "black"
color: "transparent"
antialiasing: true
MouseArea {
anchors.fill: parent
drag.target: parent
}
}
}
}
Результат
В примере получается следующий результат:
Исходное окно
Измененное окно
Фрейм перемещается
Размер окна снова изменяется
Ответ №2:
Как я уже сказал в своем комментарии, лучшим решением является привязка, например:
Window {
id: root
width: 600
height: 400
title: qsTr("Parent window")
visible: true
flags: Qt.WindowStaysOnTopHint
Grid {
anchors.fill: parent
Repeater {
model: 16
Rectangle {
width: root.width / 4
height: root.height / 4
color: Qt.rgba(Math.random(),Math.random(),Math.random(),1)
}
}
}
Rectangle {
border {
width: 5
color: "black"
}
color: "transparent"
width: root.width / 4
height: root.height / 4
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.leftMargin: root.width / 4
anchors.bottomMargin: root.height / 4
}
}
Комментарии:
1. В моем случае прямоугольник можно перемещать абсолютно свободно с помощью перетаскивания.
2. итак, что вы хотите сохранить? x и y? ширина, высота? это относительно родительского размера или абсолютного?