I’m looking for a way of dragging frameless window in QtQuick2. I followed this thread on the forum Link but it gives me an error.
Main difference in the code is that my code uses QtQuick2ApplicationViewer
instead of QmlApplicationViewer
and it looks like QtQuick2ApplicationViewer
do not have “.pos” property.
This is my main.cpp
#include <QtGui/QGuiApplication>
#include "qtquick2applicationviewer.h"
#include <QQmlContext>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QtQuick2ApplicationViewer viewer;
viewer.rootContext()->setContextProperty("QmlApplicationViewer", (QObject *)&viewer);
viewer.setFlags(Qt::FramelessWindowHint);
viewer.setMainQmlFile(QStringLiteral("qml/ubusell/main.qml"));
viewer.showExpanded();
return app.exec();
}
This is part of my main.qml
MouseArea {
id: mouseRegion
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)
print(QmlApplicationViewer.pos)
QmlApplicationViewer.pos = (20,20)
QmlApplicationViewer.pos = Qt.point(QmlApplicationViewer.pos.x+delta.x,
QmlApplicationViewer.pos.y+delta.y)
}
}
When I try to drag window I get this error:
TypeError: Cannot read property 'x' of undefined
Any ideas ? Is it even possible with QtQuick2 ? Thanks for help!
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
.
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
}
}
}
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.
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
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With