QtQuick2 dragging frameless window
I done it as follow:
Window {
id: window
height: 400
width: 250
x: (Screen.width - width)/2 //<---start position of window
y: (Screen.height - height)/2 //<-┘
color: "transparent"
flags: Qt.MSWindowsFixedSizeDialogHint | Qt.FramelessWindowHint
MouseArea {
anchors.fill: parent
property point lastMousePos: Qt.point(0, 0)
onPressed: { lastMousePos = Qt.point(mouseX, mouseY); }
onMouseXChanged: window.x += (mouseX - lastMousePos.x)
onMouseYChanged: window.y += (mouseY - lastMousePos.y)
}
Item {
id: myFirstPage
anchors.fill: parent
anchors.topMargin: 50
//...
//This item can have some mouse area
}
}
Now you can move window using dragging top 50 pixels or any where that is not under any MouseArea.
Also to resemble Windows behaviour of maximizing window when dragging it above vertical edge of the screen:
MouseArea {
anchors.fill: parent;
property variant clickPos: "1,1"
onPressed: {
clickPos = Qt.point(mouse.x,mouse.y)
}
onPositionChanged: {
var delta = Qt.point(mouse.x-clickPos.x, mouse.y-clickPos.y)
var new_x = mainWindow.x + delta.x
var new_y = mainWindow.y + delta.y
if (new_y <= 0)
mainWindow.visibility = Window.Maximized
else
{
if (mainWindow.visibility === Window.Maximized)
mainWindow.visibility = Window.Windowed
mainWindow.x = new_x
mainWindow.y = new_y
}
}
}
In my project I do:
property variant clickPos: "1,1"
onPressed: {
clickPos = Qt.point(mouse.x,mouse.y)
}
onPositionChanged: {
var delta = Qt.point(mouse.x-clickPos.x, mouse.y-clickPos.y)
rootWindow.x += delta.x;
rootWindow.y += delta.y;
}
In MouseArea
.
A rather complete example:
import QtQuick 2.14
import QtQuick.Controls 2.14
ApplicationWindow {
visible: true
width: 200
height: 200
flags: Qt.FramelessWindowHint
MouseArea {
anchors.fill: parent
onPressed: { pos = Qt.point(mouse.x, mouse.y) }
onPositionChanged: {
var diff = Qt.point(mouse.x - pos.x, mouse.y - pos.y)
ApplicationWindow.window.x += diff.x
ApplicationWindow.window.y += diff.y
}
property point pos
}
}