QML应用程序窗口调整大小时出现卡顿

3

我遇到了一个问题,希望这是因为我的QML编码不好而不是Qt中的一些基本错误。

每当我在水平方向(宽度改变)调整应用程序窗口大小时,窗口不会调整到我释放鼠标的位置,而是“弹回”到其最小宽度。我已经将其剥离到最基本的要求以重现此错误。

  • 不释放鼠标按下会导致宽度在最小宽度和鼠标位置之间来回跳动。
  • 删除项目可以消除此错误。
  • 垂直调整大小(更改高度)如果鼠标长时间未释放(例如正在调整状态),可能会导致应用程序崩溃。
  • 由于这个问题几乎不可能进行大小调整。

main.qml

import QtQuick 2.5
import QtQuick.Window 2.2
import QtQuick.Controls 1.4

ApplicationWindow {
    id: root
    visible: true
    minimumHeight: 768
    minimumWidth: 1024
    title: qsTr("Test")
    color: "#292525"

    Item {
        width: 0.9*parent.width
        height: 0.1*parent.height
    }
}

有什么想法为什么会发生这种情况吗?
1个回答

6
您遇到了微妙的绑定循环形式。QtQuickControls的 ApplicationWindow 尝试保持窗口内容的大小与其中的内容 contentItem 相匹配,所有 ApplicationWindow 的子级(悄悄地)被重新分配其父级,但您正在使内容的大小依赖于所在的窗口。

因此,当您调整窗口大小时,会更改Item 的大小,这会更改 contentItem 的大小,使 ApplicationWindow 调整您的窗口大小(与您抗争)。

可以尝试类似以下方法:

import QtQuick 2.5
import QtQuick.Window 2.2
import QtQuick.Controls 1.4

ApplicationWindow {
    id: root

    visible: true
    minimumHeight: 768
    minimumWidth: 1024
    title: qsTr("Test")
    color: "#292525"

    // This item will just match the Window's size...
    Item {
        anchors.fill: parent

        // ... and here, we'll fill a part of it with a rectangle.
        Rectangle {
            color: "red"
            width: 0.9*parent.width
            height: 0.1*parent.height
        }
    }
}

谢谢Robin,我之前不知道绑定循环的存在。 - arynaq
或者用挪威语说,谢谢 :) - arynaq
非常愉快! :) - Robin Burchell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接