首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在QJsEngine中注册Qt中的自定义类型

在QJsEngine中注册Qt中的自定义类型
EN

Stack Overflow用户
提问于 2020-07-08 18:00:13
回答 2查看 205关注 0票数 0

我有一个名为LObject的自定义类,还有一个我想调用的方法"test“。我有一个在QJSEngine中注册的方法,它返回LObject的一个实例。我在执行该方法时收到错误消息:

代码语言:javascript
复制
"Error: Unknown method return type: LObject"

我试图用Q_DECLARE_METATYPE注册我的类型,但是之后我无法调用我的LObject的方法。

该怎么做呢?

编辑:包含3个文件的最小示例

server.h:

代码语言:javascript
复制
#ifndef SERVER_H
#define SERVER_H
#include <QObject>
#include <QString>
#include <QQmlEngine>
#include <QQuickView>
#include <QQmlContext>
#include <qqml.h>



class TObject : public QObject
{
    Q_OBJECT
    QML_ELEMENT
public :
    TObject(QObject * parent = nullptr, const QString & data = "") : QObject(parent) ,m_data(data){}
    TObject(const TObject & other) : QObject() ,m_data(other.m_data) {}
    ~TObject(){};
    TObject& operator=(const TObject & other) { m_data = other.m_data;return *this;}
    Q_INVOKABLE QString getData() { return m_data;}
    Q_INVOKABLE void setData(const QString & data) {m_data = data;}
private :
    QString m_data;
};


class Server : public QObject
{
    Q_OBJECT
public :

    QQmlEngine * newEngine()
    {
        QQmlEngine * ret = new QQmlEngine(this);
        ret->rootContext()->setContextProperty("Server",this);
        return ret;
    }
    Q_INVOKABLE TObject newTObject() { return TObject();}
};

Q_DECLARE_METATYPE(TObject)
#endif // SERVER_H

main.cpp:

代码语言:javascript
复制
#include "server.h"
#include <QApplication>

int main(int argc, char *argv[])

{
    QApplication a(argc, argv);

    Server s;
    QQmlEngine * e = s.newEngine();

    QQuickView view(e,nullptr);
    view.setSource(QUrl("test.qml"));
    view.show();

    return a.exec();
}

test.qml

代码语言:javascript
复制
import QtQuick 2.9
import QtQuick.Window 2.9

Text 
{
    function test()
    {
        let t = Server.newTObject() //test.qml:8: Error: Unknown method return type: TObject
        t.setData("TEST")
        return t.getData()
    }

    text : test();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-10 19:10:35

解决了!

代码语言:javascript
复制
qmlRegisterInterface<TObject>("TObject",1);

然后这些方法必须返回一个TObject*。

票数 0
EN

Stack Overflow用户

发布于 2020-09-04 04:36:05

注册QMetaType::qRegisterMetaType应该可以解决您的问题。简而言之,QT元对象需要它来匹配返回类型的名称和你的类的名称:

代码语言:javascript
复制
qRegisterMetaType<TObject>();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62792225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档