qdbus和自定义类型的编组 我想通过Qt DUS API发送自定义C++类。我已经使用protoc编译器从.proto文件创建了这个类,并将它们添加到我在QtCreator中的项目中。现在我想验证是否可以通过DBUSAPI将自定义类作为QVariant发送。我有一个接收器和发送器程序,可以发送一个简单的测试字符串,以便Dbus工作。在将协议缓冲区类添加为元类型后,我无法发送它
我的test.proto文件只包含int:qdbus和自定义类型的编组 我想通过Qt DUS API发送自定义C++类。我已经使用protoc编译器从.proto文件创建了这个类,并将它们添加到我在QtCreator中的项目中。现在我想验证是否可以通过DBUSAPI将自定义类作为QVariant发送。我有一个接收器和发送器程序,可以发送一个简单的测试字符串,以便Dbus工作。在将协议缓冲区类添加为元类型后,我无法发送它,qt,qt4,protocol-buffers,qtembedded,qdbus,Qt,Qt4,Protocol Buffers,Qtembedded,Qdbus,我的test.proto文件只包含int: message MyData { required int32 name = 1; required int32 id = 2; optional int32 email = 3; } 在我添加的协议缓冲区类头文件中: #include <QMetaType> #include <QDBusMetaType> ... friend QDBusArgument &operator<<(QDBusA
message MyData {
required int32 name = 1;
required int32 id = 2;
optional int32 email = 3;
}
在我添加的协议缓冲区类头文件中:
#include <QMetaType>
#include <QDBusMetaType>
...
friend QDBusArgument &operator<<(QDBusArgument &argument, const MyData &dataToWrite);
friend const QDBusArgument &operator>>(const QDBusArgument &argument, MyData &dataToWrite);
...
Q_DECLARE_METATYPE(MyData )
#include <QDebug>
...
#include <QMetaType>
#include <QDBusMetaType>
// Marshall the MyData data into a D-Bus argument
QDBusArgument &operator<<(QDBusArgument &argument, const MyData &dataToWrite)
{
qDebug() << "OPERATOR<<";
argument.beginStructure();
// Break out the various properties of dataToWrite protocol buffer
int name = dataToWrite.name();
int id = dataToWrite.id();
int email = dataToWrite.email();
qDebug() << name;
qDebug() << id;
qDebug() << email;
argument << name;
argument << id;
argument << email;
argument.endStructure();
return argument;
}
// Retrieve the MyData data from the D-Bus argument
const QDBusArgument &operator>>(const QDBusArgument &argument, MyData &dataToWrite)
{
qDebug() << "OPERATOR>>";
argument.beginStructure();
// Break out the various properties of dataToWrite protocol buffer
int name = dataToWrite.name();
int id = dataToWrite.id();
int email = dataToWrite.email();
qDebug() << name;
qDebug() << id;
qDebug() << email;
argument >> name;
argument >> id;
argument >> email;
argument.endStructure();
return argument;
}
#包括
#包括
...
friend QDBusArgument和运算符(常量QDBusArgument和argument,MyData和dataToWrite);
...
Q_DECLARE_元类型(MyData)
在我添加的协议缓冲区类实现文件中:
#include <QMetaType>
#include <QDBusMetaType>
...
friend QDBusArgument &operator<<(QDBusArgument &argument, const MyData &dataToWrite);
friend const QDBusArgument &operator>>(const QDBusArgument &argument, MyData &dataToWrite);
...
Q_DECLARE_METATYPE(MyData )
#include <QDebug>
...
#include <QMetaType>
#include <QDBusMetaType>
// Marshall the MyData data into a D-Bus argument
QDBusArgument &operator<<(QDBusArgument &argument, const MyData &dataToWrite)
{
qDebug() << "OPERATOR<<";
argument.beginStructure();
// Break out the various properties of dataToWrite protocol buffer
int name = dataToWrite.name();
int id = dataToWrite.id();
int email = dataToWrite.email();
qDebug() << name;
qDebug() << id;
qDebug() << email;
argument << name;
argument << id;
argument << email;
argument.endStructure();
return argument;
}
// Retrieve the MyData data from the D-Bus argument
const QDBusArgument &operator>>(const QDBusArgument &argument, MyData &dataToWrite)
{
qDebug() << "OPERATOR>>";
argument.beginStructure();
// Break out the various properties of dataToWrite protocol buffer
int name = dataToWrite.name();
int id = dataToWrite.id();
int email = dataToWrite.email();
qDebug() << name;
qDebug() << id;
qDebug() << email;
argument >> name;
argument >> id;
argument >> email;
argument.endStructure();
return argument;
}
#包括
...
#包括
#包括
//将MyData数据整理成D-Bus参数
QDBusArgument&operator要实现此功能,请执行如下操作:
// PROTOBUF-MODIFICATION-DBUS
// Marshall the companyData data into a D-Bus argument
QDBusArgument &operator<<(QDBusArgument &argument, const companyData &dataToWrite)
{
argument.beginStructure();
// Break out the various properties of dataToWrite protocol buffer
int name = dataToWrite.name();
int id = dataToWrite.id();
int email = dataToWrite.email();
argument << name;
argument << id;
argument << email;
argument.endStructure();
return argument;
}
// PROTOBUF-MODIFICATION-DBUS
// Retrieve the companyData data from the D-Bus argument
const QDBusArgument &operator>>(const QDBusArgument &argument, companyData &dataToWrite)
{
int name, id, email;
argument.beginStructure();
argument >> name;
argument >> id;
argument >> email;
argument.endStructure();
dataToWrite.set_name(name);
dataToWrite.set_id(id);
dataToWrite.set_email(email);
return argument;
}
//PROTOBUF-MODIFICATION-DBUS
//将companyData数据整理成D-Bus参数
QDBusArgument&operator>id;
论点>>电子邮件;
argument.endStructure();
dataToWrite.set_name(名称);
dataToWrite.set_id(id);
dataToWrite.set_电子邮件(email);
返回参数;
}
我也看到了同样的情况,客户机调用了两次编组。在服务器端,首先调用编组,然后调用解编组。我也很困惑。我也提出了一个问题-。你运气好吗?为什么会这样?但有趣的是,我的代码运行良好。
Sending 2
Sending 3
Sending 4
OPERATOR<<
0
0
0
OPERATOR<<
2
3
4
Command: Contacting Protobuf Receiver and calling WRITENVRAM...
Response: HELLO CLASS
OPERATOR<<
0
0
0
OPERATOR>>
0
0
0
WRITE NVRAM COMMAND CALLED
Unpacking: 0
Unpacking: 0
Unpacking: 0
// PROTOBUF-MODIFICATION-DBUS
// Marshall the companyData data into a D-Bus argument
QDBusArgument &operator<<(QDBusArgument &argument, const companyData &dataToWrite)
{
argument.beginStructure();
// Break out the various properties of dataToWrite protocol buffer
int name = dataToWrite.name();
int id = dataToWrite.id();
int email = dataToWrite.email();
argument << name;
argument << id;
argument << email;
argument.endStructure();
return argument;
}
// PROTOBUF-MODIFICATION-DBUS
// Retrieve the companyData data from the D-Bus argument
const QDBusArgument &operator>>(const QDBusArgument &argument, companyData &dataToWrite)
{
int name, id, email;
argument.beginStructure();
argument >> name;
argument >> id;
argument >> email;
argument.endStructure();
dataToWrite.set_name(name);
dataToWrite.set_id(id);
dataToWrite.set_email(email);
return argument;
}