将矩形附加和分离到 QML 中的移动矩形

Posted

技术标签:

【中文标题】将矩形附加和分离到 QML 中的移动矩形【英文标题】:Attach and detach a Rectangle to a moving Rectangle in QML 【发布时间】:2020-05-04 12:40:19 【问题描述】:

我想在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"

目前我已经尝试将slave连接和分离到master:

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

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

问题是,如果主机已经在移动,按下按钮将从机跳转到它从一开始就与主机一起移动的位置,然后即使在按钮之后继续与主机一起移动被释放了。

如何在qmlqml中任意将其他物体附加到移动物体上?

【问题讨论】:

【参考方案1】:

您将奴隶附加为主人的孩子的方法是导致跳跃的原因。一旦从属节点重新设置父节点,它的 x 和 y 值 100 就会将其放置在与新父节点 master 相关的位置,而不是与 mainWindow 相关的位置。

当你重新设置它时,你需要将slave的x和y相对于master设置为x和y从mainWindow坐标系到master坐标系的平移。查看Item::mapFromItemItem::mapToItem 以了解如何将mainWindow 上下文中从属设备的x 和y 100 转换为屏幕上相同的物理位置,但对于新父级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;
        
    

【讨论】:

它工作得非常好。谢谢!与此同时,我也意识到为什么释放按钮后slave 会随着master 继续移动。如果mainWindowWindow,则在重新设置slave 时应使用其contentItem,即slave.parent = mainWindow.contentItem

以上是关于将矩形附加和分离到 QML 中的移动矩形的主要内容,如果未能解决你的问题,请参考以下文章

D3 将文本附加到 SVG 矩形

如何将 UIPopover 附加到我绘制的矩形

附加到矩形线的火灾事件事件wpf c#

QML 中的类似菜单栏的行为

矩形作为 QML 中的根元素

画布中的线条和矩形