我的服务提供了一个 DBus 方法,该方法返回带有签名
a(susbs)
的数据。为了实现这个工作,我创建了一个数据结构(MyStructure
),实现了用于编组/解组的流运算符并注册了类型。如此处所述。
到目前为止,一切都很好。
但是,由于生成响应数据需要时间,因此我想发送延迟回复。
所以我遵循手册。
在手册中的示例中,如下所示:
struct RequestData
{
QString request;
QString processedData;
QDBusMessage reply;
};
void sendReply(RequestData *data)
{
// data->processedData has been initialized with the request's reply
QDBusMessage &reply = data->reply;
// send the reply over D-Bus:
reply << data->processedData; // <-- Here data is added to the reply
QDBusConnection::sessionBus().send(reply);
// dispose of the transaction data
delete data;
}
就我而言,我想要添加到回复中的数据是
QList<MyStructure>
类型。如何将其添加到回复中?
我几乎通过将数据转换为
QVariant
列表来使其工作。像这样:
void sendReply(RequestData *data, const QList<MyStructure>& result)
{
QList<QVariant> variantList;
for (const auto &item : result) {
QVariant variant;
variant.setValue(item);
variantList.append(variant);
}
QDBusMessage &reply = data->reply;
reply << variantList;
QDBusConnection::sessionBus().send(reply);
}
但是 DBus 响应具有签名
av
,其中数组中的每个项目的类型为 susbs
。
终于解决了这个问题。这比我想象的要容易:
void sendReply(RequestData *data, const QList<MyStructure>& result)
{
QVariant v;
v.setValue(result);
QDBusMessage &reply = data->reply;
reply << v;
QDBusConnection::sessionBus().send(reply);
}