嵌套的QML元素onCompleted的信号没有阻止QML对象的实例化

时间:2016-02-25 15:05:12

标签: qt signals qml

我们说我有一个 main.qml 文件:

import CustomWidgets 1.0

Item
{
    id: itemId
    anchors.fill: parent

    CustomWidget {}

    Component.onCompleted: // c++ function call
}

包含来自另一个名为 CustomWidget.qml 的文件的CustomWidget

Item
{
    id: customWidgetId
    anchors.fill: parent

    // attributes    

    Component.onCompleted: // c++ function call
}

逻辑上,CustomWidget onCompleted的信号在主要信号之前被调用。但是从我所看到的情况来看,它并没有阻塞,这意味着QML对象的实体化仍在继续。

有没有办法防止这种或那种方式?我的第一个onCompleted信号会输入一些数据,然后在第二个信号中访问。 由于目前处理信号的方式,我的应用程序在尝试访问不存在的数据(尚未初始化)时崩溃。

编辑:我想我可以添加一个简单的bool变量,当true的信号为CustomWidget onCompleted时,该变量将被设置为string FileName = "C:\\Sales.docx"; object ConfirmConversions = false; object Link = false; object Attachment = false; bookmark1.InsertFile(FileName, ref missing, ref ConfirmConversions, ref Link, ref Attachment); 过度。另一个信号会循环等待。

1 个答案:

答案 0 :(得分:2)

正如@BaCaRoZzo已经注意到,假设项目初始化与视觉初始化顺序相同,则不应构建应用程序逻辑。相反,你可以这样做:

<强> CustomWidget.qml

Item {
    signal initialized()

    Component.onCompleted: {
        // execute some code here
        initialized()
    }
}

<强> main.qml

Item {
    id: itemId

    CustomWidget {
        onInitialized: {
            // execute some secondary initialization
        }
    }
}