【问题标题】:Nested QML element onCompleted's signal not blocking the instanciation of QML objects嵌套 QML 元素 onCompleted 的信号不阻止 QML 对象的实例化
【发布时间】:2016-02-26 11:23:36
【问题描述】:

假设我有一个 ma​​in.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 变量,当CustomWidget onCompleted 的信号结束时将其设置为true。另一个信号会循环等待。

【问题讨论】:

  • onCompleted 处理程序的执行顺序未按设计定义。我认为你可以更好地重新思考你的方法。

标签: qt signals qml


【解决方案1】:

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

CustomWidget.qml

Item {
    signal initialized()

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

ma​​in.qml

Item {
    id: itemId

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 2014-01-15
    • 1970-01-01
    相关资源
    最近更新 更多