Qt6无边框窗口之MouseArea的坑

问题介绍

在网上搜索“无边框窗口”会发现大部分都是说使用MouseArea作为鼠标拖拽检测,然后通过坐标映射为窗口坐标来实现的。但是在Qt6中,该方案已经不可行,在大幅度的拖动范围下,鼠标的位置坐标是混乱的,会导致窗口闪烁胡乱移动,尝试输出鼠标位置时会有下面的输出:

 仔细观察会发现输出的坐标非常诡异,正常而言鼠标的位置范围都是在0到屏幕大小范围内的,但是输出明显不在这个范围内,因此MouseArea仅能作为拖拽检测控件是不可行的。

 

替代方案

使用 DrapHandler 作为处理拖拽事件更为合适,它提供了一个 active 检测是否处于拖拽状态可以更为方便的实现拖拽功能,下面是一个例子:

 

Window {
    id: root
    width: 640
    height: 480
    visible: true
    flags: Qt.Window | Qt.FramelessWindowHint
    color: "black"

    /*标题栏*/
    Rectangle {
        width: parent.width
        height: 30
        color: "gray"

        Item {
            anchors.fill: parent

            DragHandler { 
                onActiveChanged: if (active) root.startSystemMove()
            }
        }
    }
}

 

可以看到代码非常简单,最主要的就是 DragHandler 的  onActiveChanged 事件了。注意,DragHandler要放到一个组件中,否则你的标题栏会被拖走(◕‿◕)

 

posted on 2025-03-14 02:28  TN-mo  阅读(65)  评论(0)    收藏  举报