qt - 将矩形附加和分离到 QML 中的移动矩形
问题描述
我想在qml中实现,只要按住一个按钮,两个矩形就会一起移动,但是一旦我释放它,其中一个矩形就会保持在释放时的位置。
以搬家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
}
}
}
问题是,如果主机已经在移动,按下按钮将使从机跳转到它从一开始就与主机一起移动的位置,然后即使在释放按钮后仍继续与主机一起移动。
如何任意将其他对象附加到移动对象上,然后在qml中将它们分离?
解决方案
您将奴隶作为主人的孩子的方法是导致跳跃的原因。一旦从属设备被重新设置,它的 x 和 y 为 100 就将其放置在相对于其新父级的master
位置,而不是相对于 mainWindow 的位置。
当你重新设置它时,你需要将slave的x和y相对于master设置为x和y从mainWindow坐标系到master坐标系的平移。查看Item::mapFromItem
并Item::mapToItem
了解如何将 slave 的 x 和 y 的 100 在 的上下文中mainWindow
转换为屏幕上的相同物理位置但就新的 parent 而言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;
}
}
}
推荐阅读
- python - 如何在python中返回ADD AND的结果?
- c++ - DirectoryIterator 可能存在的错误
- c# - 如何通过表达式模拟字符串+字符串?
- mysql - 选择多列多行的条件
- elasticsearch - 如何在docker中以root身份运行elasticsearch?
- mongodb - MongoDB $lookup 聚合 - 从文档中仅检索一个字段
- android - 无法通过 Play 商店上传应用程序 - 推出按钮已禁用
- r - 将图例项目从数字更改为 ggplot 中的字符
- ruby-on-rails - 在生产中加载 webpacker 资产
- android - java.lang.NullPointerException:尝试调用虚拟方法'float android.view.InputDevice$MotionRange.getMin()'