void ImControlThread::telepathyMessageReceived(const QDBusMessage &reply) { foreach (QVariant arg, reply.arguments()) { if (arg.canConvert<QDBusArgument>()) { qDebug() << dbusArgumentToVariant(arg.value<QDBusArgument>()); } else { qDebug() << arg; } } } QVariant dbusArgumentToVariant(const QDBusArgument &arg) { switch (arg.currentType()) { case QDBusArgument::BasicType: case QDBusArgument::VariantType: return basicTypeToVariant(arg); case QDBusArgument::ArrayType: return arrayTypeToVariant(arg); case QDBusArgument::MapType: return mapTypeToVariant(arg); default: return QVariant(); } } QVariant basicTypeToVariant(const QDBusArgument &arg) { return arg.asVariant(); } QVariant arrayTypeToVariant(const QDBusArgument &arg) { QVariantList list; arg.beginArray(); while (!arg.atEnd()) { list << dbusArgumentToVariant(arg); } arg.endArray(); return list; } QVariant mapTypeToVariant(const QDBusArgument &arg) { QVariantMap map; arg.beginMap(); while (!arg.atEnd()) { arg.beginMapEntry(); map[basicTypeToVariant(arg).toString()] = dbusArgumentToVariant(arg); arg.endMapEntry(); } arg.endMap(); return map; }