Component.onCompleted中的属性值错误

时间:2014-10-20 10:14:34

标签: qt qml

我的问题如下:我有一个基于Rectangle的自定义QML对象,我需要执行一些宽带&的javascript函数。创建时该对象的高度 为此,我使用Component.onCompleted来执行javascript,但在此函数中,width和height属性是错误的(如0; 0或0; -30),就像它们尚未创建一样。

代码:

import QtQuick 2.3

import "js/kloggr.js" as Game

Rectangle {
    property var kloggr: undefined

    MouseArea {
        anchors.fill: parent
        // outputs the right values (about 400;600)
        onClicked: console.log(width+";"+height);
    }

    Component.onCompleted: {
        Game.kloggr = this;
        kloggr = new Game.Kloggr(width, height);
        console.log(width+";"+height); // outputs 0;-30
    }
}

此对象的创建方式如下:

Kloggr {
    id: kloggr

    anchors.top: parent.top
    anchors.left: parent.left
    anchors.right: parent.right
    anchors.bottom: pauseBtn.top
}

(我删除了代码中不相关的部分)

那么我做错了什么,或者我能做些什么来获得相同的结果呢?

2 个答案:

答案 0 :(得分:0)

您忘记设置矩形的宽度和高度......

import QtQuick 2.3
import "js/kloggr.js" as Game

Rectangle {
    width: 300
    height: 300
    property var kloggr: undefined

    MouseArea {
        anchors.fill: parent
        // outputs the right values (about 400;600)
        onClicked: console.log(width+";"+height);
    }

    Component.onCompleted: {
        Game.kloggr = this;
        kloggr = new Game.Kloggr(width, height);
        console.log(width+";"+height); // outputs 0;-30
        //now h + w = 300
    }
}

如果您使用锚点,请按项目更改矩形,例如

import QtQuick 2.3
import "js/kloggr.js" as Game

Item{
    //without W and Height if you don't use the designer, if you use the designer you should set a default size

    property var kloggr: undefined
    Rectangle{
        anchors.fill : parent
        MouseArea {
            anchors.fill: parent
            // outputs the right values (about 400;600)
            onClicked: console.log(width+";"+height);
       }

        Component.onCompleted: {
            Game.kloggr = this;
            kloggr = new Game.Kloggr(width, height);
            console.log(width+";"+height); // outputs 0;-30
       }
  }//end of rectangle

} //end of item

答案 1 :(得分:0)

我没有发现它是否是一个bug或者什么,但我发现了一个解决方法:而不是使用Component.onCompleted我使用了onVisibleChanged:

onVisibleChanged: {
    if (visible && kloggr === undefined) {
        Game.kloggr = this;
        kloggr = new Game.Kloggr(width, height);
    }
}

似乎宽度和高度属性仅在对象设置为可见时有效... 谢谢@yekmen的帮助