Search code examples
c++qtresizeqmlwindow

How to get a signal when window manager is done resizing window in qt QML?


I'm trying to achieve a similar effect as iTunes' miniPlayer when resizing happens on macOS. That is, detecting when a resizing of the the window has been completed, THEN changing the height to a certain value. Here is a visual example :

enter image description here

The problem is that no signal in a QML window exists to notify me when the window manager is done resizing (that is, the user released the handle). Hence, if I don't have a signal and apply my height change as soon as width or height is changed during resizing, the window will flicker (double resize happens) as long as the user didn't release the handle.

Thanks for any input or help!


Solution

  • You could implement your own resize handle pretty easily, using a MouseArea and handling the final resize calculation using onReleased (here forcing the height to be 75% of the width on release):

    Window {
        id: window
        flags: Qt.FramelessWindowHint
        visible: true
        height: 300
        width: 400
    
        MouseArea {
            id: resize
            anchors {
                right: parent.right
                bottom: parent.bottom
            }
            width: 15
            height: 15
            cursorShape: Qt.SizeFDiagCursor
    
            property point clickPos: "1,1"
    
            onPressed: {
                resize.clickPos  = Qt.point(mouse.x,mouse.y)
            }
    
            onPositionChanged: {
                var delta = Qt.point(mouse.x-resize.clickPos.x, mouse.y-resize.clickPos.y)
                window.width += delta.x;
                window.height += delta.y;
            }
    
            onReleased: {
                window.height = .75 * window.width
            }
    
            Rectangle {
                id: resizeHint
                color: "red"
                anchors.fill: resize
            }
        }
    }