【QML记录】无边框窗口实现拖动

需要拖动自定义菜单栏时,若窗口在最大化状态即先进行窗口化再移动

    Rectangle {
        id: background_menuBar
        width: parent.width
        height: 40
        color: mainWindow.active ? "#3C3C3C" : "#323233"
        MouseArea {
            id: menuBarMouseArea
            x: 0
            y: 0
            width: mainWindow.width
            height: mainWindow.height
            acceptedButtons: Qt.LeftButton
            property int pressedX
            property int pressedY
            //记录鼠标在区域内按下时坐标
            onPressed: function(mouse){
                pressedX = mouse.x
                pressedY = mouse.y
            }
            onPositionChanged: function(mouse){
                //移动主窗口位置为原位置+差异值
                if(visibility==4){
                    //记录点击位置与最大化时窗口宽高的比值
                    var xRatio = pressedX / mainWindow.width
                    var yRatio = pressedY / mainWindow.height
                    //窗口化
                    visibility = "Windowed"
                    //算出窗口化后同比值的镜像点
                    var mirrorX = xRatio * mainWindow.width + mainWindow.x
                    var mirrorY = yRatio * mainWindow.height + mainWindow.y
                    //原点击位置与镜像点的差值
                    mainWindow.x += pressedX - mirrorX
                    mainWindow.y += pressedY - mirrorY
                    //拖动使得窗口化后,因mouseXY是当前窗口的相对坐标位置
                    //之前记录的pressedXY是最大化时的,需要进行同比缩小
                    menuBarMouseArea.pressedX = xRatio * mainWindow.width
                    menuBarMouseArea.pressedY = yRatio * mainWindow.height
                    return
                }
                mainWindow.x = mainWindow.x + (mouse.x - pressedX)
                mainWindow.y = mainWindow.y + (mouse.y - pressedY)
            }
        }

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值