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
答案 0 :(得分:2)
doSomething
每次width
或 height
ApplicationWindow
更改时都会运行。窗口可以同时改变两个尺寸的尺寸。如果在一个时刻大小从100x100变为101x101,则widthChanged
和heightChanged
将发出width=101
和height=101
两个信号。这就是为什么console.log("width & height same as last time")
被执行的原因,尽管乍一看这绝不应该发生。
评论正在运行的doSomething
。对我来说doSomething
永远不会开火,除非我调整窗口大小。如果对你而言它在应用程序启动时会触发它可能是因为在短时间内ApplicationWindow
有一些初始大小(例如0x0),之后它会将大小更改为640x480并运行doSomething
。 / p>
在极少数情况下,我上面写的可能无效。您可以尝试仅在一个维度中调整ApplicationWindow
的大小,有时仍会针对相同的值发生两次changed
信号。我的猜测是,在这些情况下,值变化如此之快,以至于在QML中触发changed
两次,您只读取第二个值。
我怀疑它是这样的:
然后width=100
会快速将值更改为101
点火changed
,对102
和changed
的更改将被解除。之后,正在执行QML信号。现在您收到两个changed
信号,但在两者中都读取了值102
。