QtQuick2 dragging frameless window
我正在寻找一种在 QtQuick2 中拖动无框窗口的方法。
我在论坛链接上关注了这个帖子,但它给了我一个错误。
代码的主要区别是我的代码使用
这是我的 main.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #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(); } |
这是我的 main.qml
的一部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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) } } |
当我尝试拖动窗口时出现此错误:
TypeError: Cannot read property 'x' of undefined
有什么想法吗?
甚至可以使用 QtQuick2 吗?
感谢您的帮助!
在我的项目中我这样做:
1 2 3 4 5 6 7 8 9 10 11 | 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; } |
在
也类似于 Windows 在将窗口拖动到屏幕垂直边缘上方时最大化窗口的行为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 } } } |
我是这样做的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | Window { id: window height: 400 width: 250 x: (Screen.width - width)/2 //<---start position of window y: (Screen.height - height)/2 //<-a"? 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 } } |
现在您可以通过拖动顶部 50 像素或任何不在任何 MouseArea 下的位置来移动窗口。
一个比较完整的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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 } } |