Qt5 QML,为什么onHeightChanged和onWidthChanged调用没有变化?

时间:2016-05-17 22:36:18

标签: qml qt5

import QtQuick 2.5
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
import QtQuick.Layouts 1.2

ApplicationWindow
{
    visible: true
    width: 640
    height: 480

    property int lastW: 0
    property int lastH: 0

    function doSomething()
    {
        if (lastW == width && lastH == height)
            console.log("width & height same as last time")

        lastW = width;
        lastH = height;
    }

    onHeightChanged: doSomething();
    onWidthChanged: doSomething();
}

为什么调用doSomething时宽度和高度没有变化(开始时除外)。当我调整窗口大小时,我会收到控制台日志消息。

运行Windows 8.1

1 个答案:

答案 0 :(得分:2)

doSomething每次width height ApplicationWindow更改时都会运行。窗口可以同时改变两个尺寸的尺寸。如果在一个时刻大小从100x100变为101x101,则widthChangedheightChanged将发出width=101height=101两个信号。这就是为什么console.log("width & height same as last time")被执行的原因,尽管乍一看这绝不应该发生。

评论正在运行的doSomething。对我来说doSomething永远不会开火,除非我调整窗口大小。如果对你而言它在应用程序启动时会触发它可能是因为在短时间内ApplicationWindow有一些初始大小(例如0x0),之后它会将大小更改为640x480并运行doSomething。 / p>

在极少数情况下,我上面写的可能无效。您可以尝试仅在一个维度中调整ApplicationWindow的大小,有时仍会针对相同的值发生两次changed信号。我的猜测是,在这些情况下,值变化如此之快,以至于在QML中触发changed两次,您只读取第二个值。

我怀疑它是这样的: 然后width=100会快速将值更改为101点火changed,对102changed的更改将被解除。之后,正在执行QML信号。现在您收到两个changed信号,但在两者中都读取了值102