如何在 QML 中调整无框窗口的大小?

Sli*_*mRG 2 c++ qt qml c++17 qt6

如何返回无框窗口中边框的调整大小逻辑?

框架窗口具有以下逻辑: 在此输入图像描述

QML 中的代码:

import QtQuick
import QtQuick.Controls 2.5
import Qt5Compat.GraphicalEffects
import NR 1.0

Window {
    id: mainWindow
    width: 640
    height: 720
    visible: true
    title: qsTr("Hello World")
    flags: Qt.Window | Qt.FramelessWindowHint
    color: "transparent"

    // (1)

    MouseArea {
        id: bottomArea
        height: 5
        anchors {
            bottom: parent.bottom
            left: parent.left
            right: parent.right
        }
        cursorShape: Qt.SizeVerCursor

        onPressed: {
            previousY = mouseY
        }

        onMouseYChanged: {
            var dy = mouseY - previousY
            mainWindow.setHeight(mainWindow.height + dy)
        }
    }
    // Some code of another Items here
}
Run Code Online (Sandbox Code Playgroud)

我在左侧尝试了以下代码:

 MouseArea {
        id: leftSideMouseArea
        anchors.fill: parent
        property point lastMousePos: Qt.point(0, 0)
        onPressed: { lastMousePos = Qt.point(mouseX, mouseY); }
        onMouseXChanged: mainWindow.width += (mouseX + lastMousePos.x)
    }
Run Code Online (Sandbox Code Playgroud)

我将此代码放在 (1) 位置,但它不起作用 - 单击(不移动)窗口会调整到右侧大小,并且应用程序崩溃并出现错误:

QQuickPaintedItem::textureProvider:只能在暴露窗口的渲染线程上查询

这看起来像图片上的: 在此输入图像描述

你能帮助我吗?

谢谢!

smr*_*smr 5

此后Qt5.15,我们有了startSystemResize,它执行本机调整大小,并且建议不要使用诸如将单击位置与当前位置进行比较之类的方法。

功能非常简单;一旦经过边缘,窗口就开始调整大小。

无框窗户的示例如下所示:

自定义窗口.QML

使用此属性更改可按下鼠标的窗口边缘的偏移量。
property int edgeOffest: 5

也可以用于移动窗口,您可以使用 a DragHandler,它在激活时会调用startSystemMove

Window {
    width: 200; height: 100
    color: '#fab'
    flags: Qt.Window | Qt.FramelessWindowHint

    DragHandler {
        onActiveChanged: if(active) startSystemMove();
    }

    MouseArea {
        id: mouseArea
        anchors.fill: parent
        hoverEnabled: true
        acceptedButtons: Qt.LeftButton

        property int edges: 0;
        property int edgeOffest: 5;

        function setEdges(x, y) {
            edges = 0;
            if(x < edgeOffest) edges |= Qt.LeftEdge;
            if(x > (width - edgeOffest))  edges |= Qt.RightEdge;
            if(y < edgeOffest) edges |= Qt.TopEdge;
            if(y > (height - edgeOffest)) edges |= Qt.BottomEdge;
        }

        cursorShape: {
            return !containsMouse ? Qt.ArrowCursor:
                   edges == 3 || edges == 12 ? Qt.SizeFDiagCursor :
                   edges == 5 || edges == 10 ? Qt.SizeBDiagCursor :
                   edges & 9 ? Qt.SizeVerCursor :
                   edges & 6 ? Qt.SizeHorCursor : Qt.ArrowCursor;
        }

        onPositionChanged: setEdges(mouseX, mouseY);
        onPressed: {
            setEdges(mouseX, mouseY);
            if(edges && containsMouse) {
                startSystemResize(edges);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

预览

窗口调整大小预览

最后的注释

不过,我不建议开发具有自定义功能的自定义窗口,这会迫使您处理大量功能,同时仍然感觉不像本机功能。

不过,有一些 github 项目为此提供了一些辅助库,所以请看一下这些项目。