2013-09-21 65 views
4

我正在寻找一种在QtQuick2中拖动无框窗口的方法。 我在论坛Link上休息了这个帖子,但它给了我一个错误。QtQuick2拖动无框窗口

代码的主要区别在于我的代码使用QtQuick2ApplicationViewer而不是QmlApplicationViewer,它看起来像QtQuick2ApplicationViewer没有“.pos”属性。

这是我的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(); 
} 

这是我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) 
     } 
} 

当我试图拖动窗口,我得到这个错误:

TypeError: Cannot read property 'x' of undefined

有任何想法吗 ? QtQuick2甚至可能吗? 感谢您的帮助!

回答

9

在我的项目我做的:

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; 
} 

MouseArea

+1

谢谢@Dcow!对我也有效:) –

+0

什么是'rootWindow'?我无法在qml中找到这个文件javascript – jondinham

+1

@PaulDinham rootWindow是您的主窗口或窗口的id属性,您希望dragg – Dcow

1

而且拖动屏幕上方的垂直边缘时,它类似于最大化窗口的Windows操作:

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 
     } 
    } 
} 
0

我做了如下:

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 
    } 
} 

现在你可以使用拖动顶部移动窗口50像素或任何不在任何MouseArea下的地方。