【发布时间】: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 对象生命周期的信息。如果我有时间,我会尝试做一个最小的项目。