首页 > 解决方案 > 当窗口管理器在 qt QML 中调整窗口大小时如何获得信号?

问题描述

在 macOS 上调整大小时,我试图达到与 iTunes 的 miniPlayer 类似的效果。也就是说,检测窗口的大小调整何时完成,然后将高度更改为某个值。这是一个视觉示例:

在此处输入图像描述

问题是当窗口管理器完成调整大小(即用户释放句柄)时,QML 窗口中不存在通知我的信号。因此,如果我没有信号并且在调整大小期间一旦更改宽度或高度就应用我的高度更改,只要用户没有释放句柄,窗口就会闪烁(发生双重调整大小)。

感谢您的任何意见或帮助!

标签: c++qtresizeqmlwindow

解决方案


您可以很容易地实现自己的调整大小处理,使用 MouseArea 并使用 onReleased 处理最终的调整大小计算(这里强制高度为释放时宽度的 75%):

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

推荐阅读