【问题标题】:Signal-Slot connection after destruction of qml objects?销毁qml对象后的信号槽连接?
【发布时间】:2018-04-11 11:47:05
【问题描述】:

在销毁 qml 对象后,从 c++ 对象到 qml 对象槽的信号连接会发生什么情况?

Item {

    function qmlFunction() {
        cppObject.cppObjectFunction() 
    }

    Component.onCompleted: {
        cppObject.someSignal.connect(qmlFunction);
    }

    Component.onDestruction: {
        cppObject.someSignal.disconnect(qmlFunction);
    }
}

在我使用 disconnect() 编写 Component.onDestruction 之前,程序显示了一条错误消息:

qrc:/qml/xxxxxxxx.qml:77: TypeError: Cannot call method 'cppObjectFunction' of undefined

信号和槽的断开不是自动进行的吗?


对象 cppObject“总是”存在并以这种方式传递给 qml:

main.cpp

QQmlApplicationEngine engine;
Model* model = new Model::instance(&engine);
engine.setObjectOwnership(model, QQmlEngine::CppOwnership);
engine.rootContext()->setContextProperty("cppObject", model);
engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));

QML 项目由Loader 加载,并且可以在程序期间重新加载多次。自然,在重新加载 QML 项目并且 cppObject 触发信号someSignal 之后,就会发生错误。


在 Windows 上:Qt 5.6.2

在 linux 上:Qt 5.9.2

main.qml

import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Layouts 1.1
import QtQuick.Dialogs 1.2
import QtQuick.Controls.Styles 1.3
import QtQuick.Window 2.2

文件有错误

import QtQuick 2.3
import QtQuick.Layouts 1.1
import QtQuick.Controls 1.3

【问题讨论】:

  • 请提供更多代码。从我在这里看到的情况来看,这不应该发生。
  • 我找不到答案是文档。 cppObject是如何创建的?与您的项目相比,它的使用寿命是多少?
  • 可能是 JS 连接有问题...当你使用 QML 风格 Connections 时,问题是否仍然存在?
  • 如果您提供一个完整的最小、完整和可验证的示例,我们可能会看到,如果您有错误,或者是否应该在 bugreports.qt.io 上发布它
  • 添加了有关 cpp 对象生命周期的信息。如果我有时间,我会尝试做一个最小的项目。

标签: c++ qt qml


【解决方案1】:

简单的解决办法是:

直接从 QML 建立 cppObject 以确保在加载 QML 文件之前通过添加到 main.cpp 文件中正确清理两个对象

qmlRegisterType<Model>("com.your.app", 1, 0, "CppModel");

然后在你的 QML 文件中包含:

import com.your.app 1.0

....

CppModel {
     id: cppObject

     onSomeSignal:  { cppObject.cppObjectFunction(); }
}

这种方式将使额外的连接和额外的 qmlFunction() 都变得不必要。

也许这也是:

如果cppObjectFunction() 是在C++ 端定义的cppObject 的公共槽,您可以尝试将Q_INVOKABLE 添加到它的前面,以便将其添加到元对象系统中。

Q_INVOKABLE void cppObjectFunction()  {  /* your code */ } 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多