我在注册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();
}
错误:
感谢您的帮助。
答案 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
部分。