Registring QList <customtype>

时间:2017-07-09 20:07:45

标签: qt

我在注册QList时遇到了运行时崩溃(CustomType是由repc(Qt远程对象编译器)生成的Q_GADGET)。

实际上我正在尝试使用Qt Remote Object公开自定义类型列表。

file.rep:

POD Service(QString name, QUrl enpoint)
POD Services(QList<Service> svcs)


class ROObject
{
    PROP(bool state = false);
    PROP(Services services);
}

main.cpp中:

#include <QCoreApplication>
#include <QTimer>
#include <QRemoteObjectHost>

#include "rotest.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qRegisterMetaType<QList<Service>>();

    ROTest t;

    QList<Service> l;
    l.push_back(Service("houssem", QUrl("local:houssem")));
    l.push_back(Service("houss", QUrl("local:houss")));

    Services ss(l);

    t.setServices(ss);

    QRemoteObjectHost host;
    host.setHostUrl(QUrl("local:s"));
    host.enableRemoting(&t);

    qDebug() << "Services : " << t.services().svcs().count();

    return a.exec();
}

错误:

enter image description here

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

Qt不知道如何序列化您的自定义类型。

除了将其注册为元类型之外,还需要implement and register stream operators for it

void qRegisterMetaTypeStreamOperators(const char *typeName)
  

为名为typeName的类型T注册流操作符。

     

之后,可以使用QMetaType :: load()和流式传输类型   QMetaType ::保存()。流式传输QVariant时会使用这些函数。

qRegisterMetaTypeStreamOperators<MyClass>("MyClass");    
// The stream operators should have the following signatures:    
QDataStream &operator<<(QDataStream &out, const MyClass &myObj);
QDataStream &operator>>(QDataStream &in, MyClass &myObj);

此外,您实际需要注册为元类型的是Service QList<Service>。一旦注册了服务并且实现了其流媒体运营商,您应该全部设置,Qt知道如何处理QList部分。