gpt4 book ai didi

c++ - 将自定义 C++ 对象传递给 Qml 错误(无属性)

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:18:38 27 4
gpt4 key购买 nike

我正在尝试编写代码,通过信号将一些数据从 C++ 引擎传递到 Qml 脚本,但看起来我做错了什么,因为当我在 Qml 中接收信号时,我的对象没有任何方法或特性!看看那个代码:

Signaller - 调用信号的类:信号器.h:

class Signaller : public QObject
{
Q_OBJECT
public:
explicit Signaller(QObject *parent = 0);
Q_INVOKABLE void invokeSignal();
signals:
void mysignal(TestClass test);
public slots:

};

信号器.cpp:

Signaller::Signaller(QObject *parent) :
QObject(parent)
{
}

void Signaller::invokeSignal()
{
TestClass s;
emit mysignal(s);
}

TestClass - 将传递给 Qml 引擎的类,并且必须在 Qml 脚本中具有测试方法:

测试.h:

class TestClass : public QObject
{
Q_OBJECT
public:
explicit TestClass(QObject *parent = 0);
TestClass(const TestClass& obj);
~TestClass();
Q_INVOKABLE void test();

signals:

public slots:

};

Q_DECLARE_METATYPE(TestClass)

测试.cpp:

TestClass::TestClass(QObject *parent) :
QObject(parent)
{
qDebug()<<"TestClass::TestClass()";
}

TestClass::TestClass(const TestClass &obj) :
QObject(obj.parent())
{
qDebug()<<"TestClass::TestClass(TestClass &obj)";
}


TestClass::~TestClass()
{
qDebug()<<"TestClass::~TestClass()";
}

void TestClass::test()
{
qDebug()<<"TestClass::test";
}

这两个类也在main函数中注册:

int main(int argc, char *argv[])
{
// SailfishApp::main() will display "qml/template.qml", if you need more
// control over initialization, you can use:
//
// - SailfishApp::application(int, char *[]) to get the QGuiApplication *
// - SailfishApp::createView() to get a new QQuickView * instance
// - SailfishApp::pathTo(QString) to get a QUrl to a resource file
//
// To display the view, call "show()" (will show fullscreen on device).

qmlRegisterType<TestClass>("Test", 1, 0, "Test");
qmlRegisterType<Signaller>("Signaller", 1, 0, "Signaller");

return SailfishApp::main(argc, argv);
}

这是我带有测试代码的 Qml 文件:

import Signaller 1.0

Page {

Signaller {
id: sig
Component.onCompleted: sig.invokeSignal()
onMysignal: {
console.log("signal",typeof test);
console.log(typeof test.test);
}
}
}

和日志:

[D] TestClass::TestClass:6 - TestClass::TestClass() 
[D] TestClass::TestClass:12 - TestClass::TestClass(TestClass &obj)
[D] TestClass::TestClass:12 - TestClass::TestClass(TestClass &obj)
[D] onMysignal:41 - signal object
[D] onMysignal:42 - undefined
[D] TestClass::~TestClass:18 - TestClass::~TestClass()
[D] TestClass::~TestClass:18 - TestClass::~TestClass()

从日志中可以看出,TestClass.test 字段在传递给 Qml 后为空。我做错了什么?

最佳答案

您正在通过信号/槽系统按值传递一个 QObject 派生对象 - 您应该永远不要这样做(docs)。在堆上创建它并发送它的指针。

在这种情况下,您可能希望通过 QML 控制它的生命周期,您可以通过调用 QQmlEngine::setObjectOwnership( s, QQmlEngine::JavaScriptOwnership) 来设置它。

关于c++ - 将自定义 C++ 对象传递给 Qml 错误(无属性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28872592/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com