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

Lob*_*ter 1 c++ qt qml

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

Signaller - 调用信号的类: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:

};
Run Code Online (Sandbox Code Playgroud)

signaller.cpp:

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

void Signaller::invokeSignal()
{
    TestClass s;
    emit mysignal(s);
}
Run Code Online (Sandbox Code Playgroud)

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

Test.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)
Run Code Online (Sandbox Code Playgroud)

TEST.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";
}
Run Code Online (Sandbox Code Playgroud)

这2个类也在主函数中注册:

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);
}
Run Code Online (Sandbox Code Playgroud)

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

import Signaller 1.0

Page {

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

日志:

[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() 
Run Code Online (Sandbox Code Playgroud)

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

cma*_*t85 6

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

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