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要放到一个组件中,否则你的标题栏会被拖走(◕‿◕)
浙公网安备 33010602011771号