【问题标题】:QML QObject destroyed before being able to process a signalQML QObject 在能够处理信号之前被破坏
【发布时间】:2015-06-15 16:14:37
【问题描述】:

在 QML 中,我使用了一个 C++ 库,它返回一个 QObject,它执行一个进程并在完成时发出一个信号。在 javascript 中,我使用正在发出的信号 (success) 的 connect 方法来附加一个匿名函数,该函数应该处理信号,如下面的代码所示:

var requestResponse = apiClient.execute(reqInp);
requestResponse.success.connect(function success(response) 
{
        var requestResponseJSON = JSON.parse(response.responseAsJsonString());
        this.append(response.responseAsJsonString());
});

我的问题是,有时包含此方法的 QML 项目在 C++ 代码能够完成之前被销毁,因此当发出信号时,匿名函数会导致错误,因为它调用未定义的方法(在我的例如,方法append)。我在 iOS 中遇到了一些令人讨厌的崩溃,我怀疑这可能是导致它的原因。

当创建函数的对象被销毁时,有没有办法强制断开信号?

【问题讨论】:

    标签: javascript c++ qt qml signals-slots


    【解决方案1】:
    var requestResponse = apiClient.execute(reqInp);
    function myFunction(response) 
    {
            var requestResponseJSON = JSON.parse(response.responseAsJsonString());
            this.append(response.responseAsJsonString());
    }
    requestResponse.success.connect(myFunction);
    requestResponse.destroyed.disconnect(myFunction)
    

    【讨论】:

    • 嗨 Milovidov,QML 似乎没有暴露被破坏的信号。当我尝试你的方法时,我得到了:TypeError: Cannot call method 'disconnect' of undefined.
    • 另外,我认为被销毁的不是 requestResponse 对象,而是包含该代码的 Item,在本例中是 ListModel QML 对象。
    • @mortadelo 您可以尝试在Item 周围的destruction 信号处理程序中使用disconnect,即在您的ListModel 中编写类似这样的内容:Component.onDestruction: { /* disconnect code here*/ }
    • @BaCaRoZzo 问题是 requestResponse 对象是在项目的几个地方动态创建的,所以我事先不知道哪些存在。我可以尝试保留它们的列表,并在销毁该项目时断开所有这些信号的所有信号。然而,这听起来是 Qt 应该为我做的事情,不是吗?
    • @mortadelo 动态实例化的对象会被运行时销毁,对,但您应该考虑自己为了性能而销毁它们,请参阅here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    相关资源
    最近更新 更多