如何设置装载机

时间:2017-02-08 15:34:18

标签: qt qml loader

我想设置一个加载器来打开一个QML文件;但似乎不起作用:

 Button{//Below Right
        width:profilePicture.width/2
        height:profilePicture.width/2
        x:profilePicture.x+profilePicture.width
        y:profilePicture.y+profilePicture.height
        contentItem: Image {
            source: "Images/freecoins.png"
            anchors.fill: parent
            Rectangle{
                anchors.fill:parent
                radius: this.width
                border.color: "yellow"
                border.width: 2
                color: "transparent"
            }
        }
        onClicked: popUpFreeCoinsloader.active = true
        Loader{
            id: popUpFreeCoinsloader
            source: "PopUpFreeCoins.qml"
            active: false
            focus: true
        }
}

我也想设置该QML文件的属性,但不知道该怎么做。 例如,我有属性int a和属性int b,它们是窗口的宽度和高度,如何在loader中初始化它们,就像在这样的组件中初始化一样?:

Component{
    PopUP{a:100; b:200}
}

2 个答案:

答案 0 :(得分:0)

我不确定你的意思是“似乎不起作用”,因为Loader正常为我工作。代码应该工作。一个简单的例子:

Main.qml:

Window {
    visible: true
    width: 300
    height: 300

    Button{
        text: "button"
        onClicked: loader.active = true
    }

    Loader{
        id: loader
        active: false
        source: "Testy.qml"
        focus: true
    }
}

Testy.qml:

import QtQuick 2.7

Rectangle{
    width: 200
    height: 200
    color: "red"
}

我怀疑你的PopUpFreeCoins.qml没有正确实例化,或者宽度和高度都没有。

关于您的第二个问题,请使用sourceComponent (link)

在我的例子中很容易看到:

修改后的Main.qml:

Window {
    visible: true
    width: 300
    height: 300

    Button{
        text: "button"
        onClicked: loader.active = true
    }

    Loader{
        id: loader
        active: false
        // load customized component
        sourceComponent: rect
        focus: true
    }

    //customized component
    Component {
      id: rect

      Testy {
        //customized values
        width: 50
        height: 50
        color: "blue"
        }
    }
}

或者在你的例子中:

Loader{
    id: popUpFreeCoinsloader
    sourceComponent: popUp
    active: false
    focus: true
}

Component{
     id: popUp
     PopUP{a:100; b:200}
}

答案 1 :(得分:0)

如果您的组件是一个单独的窗口,则可能需要在加载后明确显示它。

即。加载只会使对象可用于程序,但在显示之前它将不可见,就像visible的{​​{1}}属性一样,确保显示它。

至于价值转移,你有两个选择

  1. 在加载时

    Window
  2. 这里的值将被写入已加载项目的属性中,即这是一项任务。

    1. 使用Loader { onLoaded: { item.a = 123; item.b = 456; } } 元素

      Binding
    2. 这里我们有一个属性绑定,即项的属性绑定到值,具有自动更新和所有常见的属性绑定行为