Sli*_*mRG 2 c++ qt qml c++17 qt6
如何返回无框窗口中边框的调整大小逻辑?
QML 中的代码:
import QtQuick
import QtQuick.Controls 2.5
import Qt5Compat.GraphicalEffects
import NR 1.0
Window {
id: mainWindow
width: 640
height: 720
visible: true
title: qsTr("Hello World")
flags: Qt.Window | Qt.FramelessWindowHint
color: "transparent"
// (1)
MouseArea {
id: bottomArea
height: 5
anchors {
bottom: parent.bottom
left: parent.left
right: parent.right
}
cursorShape: Qt.SizeVerCursor
onPressed: {
previousY = mouseY
}
onMouseYChanged: {
var dy = mouseY - previousY
mainWindow.setHeight(mainWindow.height + dy)
}
}
// Some code of another Items here
}
Run Code Online (Sandbox Code Playgroud)
我在左侧尝试了以下代码:
MouseArea {
id: leftSideMouseArea
anchors.fill: parent
property point lastMousePos: Qt.point(0, 0)
onPressed: { lastMousePos = Qt.point(mouseX, mouseY); }
onMouseXChanged: mainWindow.width += (mouseX + lastMousePos.x)
}
Run Code Online (Sandbox Code Playgroud)
我将此代码放在 (1) 位置,但它不起作用 - 单击(不移动)窗口会调整到右侧大小,并且应用程序崩溃并出现错误:
QQuickPaintedItem::textureProvider:只能在暴露窗口的渲染线程上查询
你能帮助我吗?
谢谢!
此后Qt5.15,我们有了startSystemResize,它执行本机调整大小,并且建议不要使用诸如将单击位置与当前位置进行比较之类的方法。
功能非常简单;一旦经过边缘,窗口就开始调整大小。
无框窗户的示例如下所示:
使用此属性更改可按下鼠标的窗口边缘的偏移量。
property int edgeOffest: 5
也可以用于移动窗口,您可以使用 a DragHandler,它在激活时会调用startSystemMove。
Window {
width: 200; height: 100
color: '#fab'
flags: Qt.Window | Qt.FramelessWindowHint
DragHandler {
onActiveChanged: if(active) startSystemMove();
}
MouseArea {
id: mouseArea
anchors.fill: parent
hoverEnabled: true
acceptedButtons: Qt.LeftButton
property int edges: 0;
property int edgeOffest: 5;
function setEdges(x, y) {
edges = 0;
if(x < edgeOffest) edges |= Qt.LeftEdge;
if(x > (width - edgeOffest)) edges |= Qt.RightEdge;
if(y < edgeOffest) edges |= Qt.TopEdge;
if(y > (height - edgeOffest)) edges |= Qt.BottomEdge;
}
cursorShape: {
return !containsMouse ? Qt.ArrowCursor:
edges == 3 || edges == 12 ? Qt.SizeFDiagCursor :
edges == 5 || edges == 10 ? Qt.SizeBDiagCursor :
edges & 9 ? Qt.SizeVerCursor :
edges & 6 ? Qt.SizeHorCursor : Qt.ArrowCursor;
}
onPositionChanged: setEdges(mouseX, mouseY);
onPressed: {
setEdges(mouseX, mouseY);
if(edges && containsMouse) {
startSystemResize(edges);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)

不过,我不建议开发具有自定义功能的自定义窗口,这会迫使您处理大量功能,同时仍然感觉不像本机功能。
不过,有一些 github 项目为此提供了一些辅助库,所以请看一下这些项目。