首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >qdbus和自定义类型的编组

qdbus和自定义类型的编组
EN

Stack Overflow用户
提问于 2012-10-11 23:20:27
回答 1查看 2.4K关注 0票数 2

我想通过Qt DBUS API发送一个自定义的c++类。我已经使用protoc编译器从.proto文件创建了这个类,并将它们添加到我的QtCreator项目中。现在,我要验证是否可以通过dbus API将定制类作为QVariant发送。我有一个接收器和发送器程序,可以发送一个简单的测试字符串,所以Dbus工作。在将protocol buffer类添加为元类型后,我在发送它时遇到了问题。

我的测试.proto文件只包含int:

代码语言:javascript
复制
message MyData {
  required int32 name = 1;
  required int32 id = 2;
  optional int32 email = 3;
}

在我添加的protocol buffer类头文件中:

代码语言:javascript
复制
#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 )

和我添加的协议缓冲区类实现文件:

代码语言:javascript
复制
#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;

}

Main看起来就像这样:

代码语言:javascript
复制
QCoreApplication a(argc, argv);

    dbussender* client = new dbussender("com.one.two.three.nvram", "/dbusReadWriteNvRam", QDBusConnection::sessionBus(), 0);

    // Create a protocol buffer class and provide its properties with values
    MyData dataToWrite;
    dataToWrite.set_name(2);
    dataToWrite.set_id(3);
    dataToWrite.set_email(4);

    QString command3 = "Contacting Protobuf Receiver and calling WRITENVRAM...";
    QString response3 = client->writeNVRam(dataToWrite);

    std::cout << "Command:   " << command3.toStdString() << std::endl;
    std::cout << "Response:   " << response3.toStdString() << std::endl;

我的dbussender类像这样调用远程函数:

代码语言:javascript
复制
inline QDBusPendingReply<QString> writeNVRam(MyData dataToWrite)
    {

        qDebug() << "Sending " << dataToWrite.name();
        qDebug() << "Sending " << dataToWrite.id();
        qDebug() << "Sending " << dataToWrite.email();

        QList<QVariant> argumentList;
        argumentList << QVariant::fromValue<MyData>(dataToWrite);
        return asyncCallWithArgumentList(QLatin1String("writeNVRam"), argumentList);
    }

最终在我的接收器程序中,这个函数被调用,但总是返回0:

代码语言:javascript
复制
// Write NVRAM
QString dbusReadWriteNvRam::writeNVRam(MyData dataToWrite) {

    qDebug() << "WRITE NVRAM COMMAND CALLED";

    qDebug() << "Unpacking: " << dataToWrite.name();
    qDebug() << "Unpacking: " << dataToWrite.id();
    qDebug() << "Unpacking: " << dataToWrite.email();

    return "HELLO CLASS";

}

以下是Sender程序的输出:

代码语言:javascript
复制
Sending  2 
Sending  3 
Sending  4 
OPERATOR<< 
0 
0 
0 
OPERATOR<< 
2 
3 
4 
Command:   Contacting Protobuf Receiver and calling WRITENVRAM...
Response:   HELLO CLASS

下面是接收器程序的输出:

代码语言:javascript
复制
OPERATOR<< 
0 
0 
0 
OPERATOR>> 
0 
0 
0 
WRITE NVRAM COMMAND CALLED 
Unpacking:  0 
Unpacking:  0 
Unpacking:  0

为什么编组函数似乎被调用了两次?为什么第二个调用似乎包含了我的protocol buffer的3个属性的有效值2,3,4,但是第一个调用都是0?接收器似乎只看到全0,并且从不接收具有有效值的协议缓冲区对象。

我的编组代码有问题吗?还能发生什么呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-16 01:03:35

要实现此操作,请像这样实现运算符:

代码语言:javascript
复制
// 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;

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12843036

复制
相关文章

相似问题

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