【问题标题】:QtQuick2 dragging frameless windowQtQuick2拖动无框窗口
【发布时间】:2013-09-21 00:04:05
【问题描述】:

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

代码的主要区别在于我的代码使用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: 无法读取未定义的属性“x”

有什么想法吗? 甚至可以使用 QtQuick2 吗? 感谢您的帮助!

【问题讨论】:

标签: qt qml qt5 qtquick2


【解决方案1】:

在我的项目中我这样做:

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

【讨论】:

  • 什么是'rootWindow'?我在 qml javascript 中找不到这个
  • @PaulDinham rootWindow 是您要拖动的主窗口或窗口的 id 属性
  • 可悲的是,当我快速移动窗口时,它会抖动很多。
  • @pepper_chico 你是对的。你找到解决方法了吗?
  • @pepper_chico 有点晚了,但我们来了stackoverflow.com/questions/39088835/…
【解决方案2】:

还类似于将窗口拖到屏幕垂直边缘上方时最大化窗口的 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
        }
    }
}

【讨论】:

    【解决方案3】:

    我是这样做的:

    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 下的位置来移动窗口。

    【讨论】:

      【解决方案4】:

      一个相当完整的例子:

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

      【讨论】:

        猜你喜欢
        • 2016-10-09
        • 1970-01-01
        • 2016-02-03
        • 1970-01-01
        • 1970-01-01
        • 2016-07-03
        • 1970-01-01
        • 2014-09-22
        • 1970-01-01
        相关资源
        最近更新 更多