QtDbus рднрд╛рдЧ 2. рд╢реБрджреНрдз рдорди рдХреА рд╡рд┐рдЬрдпреА рдЪрдордХ

рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдиреЗ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдЫреЛрдбрд╝реЗ, рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЕрдзрд┐рдХ, рдмрд╣реБрдд рдмреЗрд╣рддрд░ рдирд┐рдХрд▓рд╛ред

рдмреЛрдирд╕ рд╕реНрддрд░ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдЗрд╕рд▓рд┐рдП, KOL93 harazhitel рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд┐рдпрд╛ рдХрд┐ QDbusAbstractAdaptor рдХреЗ рдкрд╛рд╕ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЦрдмрд░ рдмрди рдЧрдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдХреА рдмрд╣реБрдд рдЖрджрдд рд╣реИ рдХрд┐ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗред рд╢рд╛рдпрдж рдпрд╣ рдХрд┐рд╕реА рдФрд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рд╕реНрдлреЛрдЯ рд╕реЗ рдмрдЪрд╛рдПрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреИрдЯрд░реНрди рдХреА рдореЗрд░реА рдЕрдЬреНрдЮрд╛рдирддрд╛, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдкреЗрдЯреЗрдВрдЯ "рдПрдбрд╛рдкреНрдЯрд░" рд╣реИред рддреЛ QAbstractAdaptor рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╣реИред рдКрдкрд░ рджрд┐рдП рдЧрдП рдФрд░ рдбреЙрдХреНрд╕ рдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдХрд┐ рдпрд╣ рд╡рд░реНрдЧ рдПрдХ рд╣рд▓реНрдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
рдкреЛрдВрдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛:
main.cpp
#include <QCoreApplication> #include <QDBusConnection> #include <QDBusError> #include <QDebug> #include "Pong.h" #include "../serviceNameAndProperty.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QDBusConnection connection = QDBusConnection::sessionBus(); Pong pong; if( ! connection.registerObject("/", &pong)){ fprintf(stderr, "%s\n", qPrintable("Can't register object")); exit(1); } qDebug()<<"Pong connected to D-bus"; if (!connection.registerService(SERVICE_NAME)) { fprintf(stderr, "%s\n", qPrintable(QDBusConnection::sessionBus().lastError().message())); exit(1); } qDebug()<<"Test service start"; return a.exec(); } 
Pong.h
 #ifndef PONG_H #define PONG_H #include <QDBusAbstractAdaptor> #include <QDBusVariant> #include <QDBusArgument> #include <QDBusContext> #include "../serviceNameAndProperty.h" class Pong; class PongAdapter : public QDBusAbstractAdaptor { Q_OBJECT Q_CLASSINFO("D-Bus Interface", BUFFER_NAME) Q_PROPERTY(QString IMAGE_DATA_SHARED_ID READ imageDataSharedId) public: explicit PongAdapter(Pong *parent); QString imageDataSharedId(); public slots: TestStructure structureField(); signals: void callingMe(QString, QString); private: Pong * m_parentPong; }; class Pong : public QObject, public QDBusContext { Q_OBJECT public: Pong() { m_pongAdapter = new PongAdapter(this); QObject::connect(this, SIGNAL(callingMe(QString,QString)), m_pongAdapter, SIGNAL(callingMe(QString, QString))); m_imageDataSharedId = "testImageBufferId"; } public: QString imageDataSharedId(); TestStructure& structureField(); signals: void callingMe(QString, QString); private: PongAdapter *m_pongAdapter; QString m_imageDataSharedId; TestStructure test; }; #endif // PONG_H> 
Pong.cpp
 #include "Pong.h" #include <QDebug> #include <QDBusMetaType> #include <QDBusConnection> #include <QDBusMessage> PongAdapter::PongAdapter(Pong *parent) : QDBusAbstractAdaptor(parent) { m_parentPong = parent; qRegisterMetaType<TestStructure>("TestStructure"); qDBusRegisterMetaType<TestStructure>(); } QString PongAdapter::imageDataSharedId() { return m_parentPong->imageDataSharedId(); } TestStructure PongAdapter::structureField() { return m_parentPong->structureField(); } QString Pong::imageDataSharedId() { return m_imageDataSharedId; } TestStructure &Pong::structureField() { qDebug()<<"Me calld"<<QDBusConnection::sessionBus().baseService()<<message().service(); emit callingMe(QString("Panic"), QString("Super panic")); test.str = QString("ku"); test.id =2; return test; } 
рдкрд┐рдВрдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛:
main.cpp
 #include <stdio.h> #include <QObject> #include <QCoreApplication> #include <QDBusConnection> #include <QDBusConnectionInterface> #include <QDBusServiceWatcher> #include <QDebug> #include "Ping.h" #include "../serviceNameAndProperty.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); Ping ping; if (!QDBusConnection::sessionBus().isConnected()) { fprintf(stderr, "Cannot connect to the D-Bus session bus.\n" "To start it, run:\n" "\teval `dbus-launch --auto-syntax`\n"); return 1; } qDebug()<<"Ping connected to D-bus"; QDBusConnectionInterface *iface = QDBusConnection::sessionBus().interface(); QDBusServiceWatcher watcher; watcher.setConnection(QDBusConnection::sessionBus());; watcher.addWatchedService(ping.m_aviableServiceName); // QObject::connect(&watcher, SIGNAL(serviceOwnerChanged(QString,QString,QString)),&ping, SLOT(manageConnection(QString,QString,QString))); QObject::connect(&watcher, SIGNAL(serviceRegistered(QString)), &ping, SLOT(connectToService(QString))); QStringList registedServices = iface->registeredServiceNames(); if(registedServices.contains(ping.m_aviableServiceName)) ping.connectToService(ping.m_aviableServiceName); return a.exec(); 

}
Ping.h
 #ifndef PING_H #define PING_H #include <QObject> #include <QDBusAbstractInterface> #include <qdbusinterface.h> class Ping : public QObject { Q_OBJECT public: explicit Ping(QObject *parent = 0); public slots: void manageConnection(const QString &name, const QString &oldVAlue, const QString &newValue); void connectToService(const QString &name); void disconnect(const QString &name); void reacoOnMeCalling(QString message, QString message2); public: QString m_aviableServiceName; private: QDBusInterface *m_interface; QString m_interfaceName; static const QString _propertyName; }; #endif // PING_H 

Ping.cpp
 #include "Ping.h" #include "../serviceNameAndProperty.h" #include <QDBusConnectionInterface> #include <QDebug> #include <QDBusMetaType> const QString Ping::_propertyName(QUIOTING(IMAGE_DATA_SHARED_ID)); Ping::Ping(QObject *parent) : QObject(parent) { m_interface = NULL; m_interfaceName = QString(BUFFER_NAME); m_aviableServiceName = QString(SERVICE_NAME); qRegisterMetaType<TestStructure>("TestStructure"); qDBusRegisterMetaType<TestStructure>(); } void Ping::manageConnection(const QString& name, const QString &oldVAlue, const QString &newValue) { Q_UNUSED(oldVAlue) if(name != m_aviableServiceName) return; if(newValue.isEmpty()) disconnect(name); else connectToService(name); } void Ping::connectToService(const QString &name) { if(name != m_aviableServiceName) return; qDebug()<<"Connceting"; m_interface = new QDBusInterface(name, "/", m_interfaceName, QDBusConnection::sessionBus(), this); QObject::connect(m_interface, SIGNAL(callingMe(QString, QString)), this, SLOT(reacoOnMeCalling(QString, QString))); if(!m_interface->isValid()){ qDebug()<<"Invalid interface"<<m_interface->lastError(); delete m_interface; m_interface = NULL; return; } qDebug()<<m_interface->interface(); QVariant var("sss"); var = m_interface->property("imageDataSharedId"); qDebug()<<var; QDBusReply<TestStructure> reply= m_interface->call("structureField"); if(reply.isValid()) { TestStructure testStructure = reply.value(); qDebug()<<testStructure.id<<testStructure.str; } } void Ping::disconnect(const QString &name) { if(name != m_aviableServiceName) return; if(name != m_interface->service()) return; delete m_interface; m_interface = NULL; qDebug()<<"Disconnect"; } void Ping::reacoOnMeCalling(QString message, QString message2) { qDebug()<<message<<message2; } 

рд╕рд╛рдЭрд╛ рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рд╕реЗрд╡рд╛NameAndProperty.h
 #pragma once #include<QMetaType> #include <QString> #include <QDBusArgument> #define SERVICE_NAME "ru.sonarh.dbus.pong" #define BUFFER_NAME "ru.buffer" #define IMAGE_DATA_SHARED_ID imageDataSharedId #define QUIOTING(text) #text struct TestStructure{ int id; QString str; }; Q_DECLARE_METATYPE(TestStructure) static QDBusArgument& operator <<(QDBusArgument &argument, const TestStructure & arg) { argument.beginStructure(); argument<<arg.id<<arg.str; argument.endStructure(); return argument; } static const QDBusArgument& operator >>(const QDBusArgument &argument, TestStructure & arg) { argument.beginStructure(); argument>>arg.id>>arg.str; argument.endStructure(); return argument; } 

рдФрд░ рдлрд┐рд░ рднреА, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ?
рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреА рдЕрдЦрдВрдбрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЦреБрдж рдХреЛ рдЕрддреАрдд рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреВрдВрдЧрд╛ред рдкреБрдирд░реБрдХреНрддрд┐ рдХрд╛ рд▓рд╛рдн рд╕реАрдЦрдиреЗ рдХреА рдЬрдирдиреА рд╣реИред
рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреЛрдВрдЧ рд╡рд░реНрдЧ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдбреА-рдмрд╕ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
  1. рдбреА-рдмрд╕ рдбреЗрдореЙрди рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред рдпрд╣ рдХрд╣реАрдВ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдорд╛рдирдХ рдЯрд╛рдпрд░ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░-рдХрд┐рдП рдЧрдП рд╕реНрдерд┐рд░ рддрд░реАрдХреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ рдХреЙрд▓ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рд╛рде рддреБрд░рдВрдд рдЖрддреА рд╣реИ
     if (!QDBusConnection::sessionBus().isConnected()) { 
  2. рд╕реБрд╡рд┐рдзрд╛ рдФрд░ рдирд┐рд╢реНрдЪрд┐рддрддрд╛ рдХреЗ рд▓рд┐рдП, рдЖрдк DNS рдХреЗ рд╕рдорд╛рди рд╕реЗрд╡рд╛ рдХреЛ рдирд╛рдо рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдкреЛрдВрдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ:
     if (!connection.registerService(SERVICE_NAME)) { 
    рдорд╣рддреНрд╡рдкреВрд░реНрдг! рдЗрд╕рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЕрд▓рдЧ рдЪрд░рд┐рддреНрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдПрдХ рдЕрд╡рдзрд┐ред
  3. рдПрдХ рдПрдбреЗрдкреНрдЯрд░ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдХрд╛ рдореВрд▓ рдкреЛрдВрдЧ рд╣реЛрдЧрд╛ред рдпрд╣ рдПрдбреЗрдкреНрдЯрд░ рдмрд╛рд╣рд░ рд╕реЗ рд╕рдВрдХреЗрдд рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рдкрд╛рд╕ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░реЗрдЧрд╛, рдмрд┐рд▓реНрдХреБрд▓ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВред рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рднреА рдЬреЛрд░ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдПрдбреЗрдкреНрдЯрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдПрдбреЗрдкреНрдЯрд░ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдорджрдж рд╕реЗ рдореМрдЬреВрджрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рдбреА-рдмрд╕ рджреБрдирд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд╕рд┐рдЧреНрдирд▓ рдХрд┐рд╕реА рддрд░рд╣ рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ:
     QObject::connect(this, SIGNAL(callingMe(QString,QString)), m_pongAdapter, SIGNAL(callingMe(QString, QString))); 
    рдорд╣рддреНрд╡рдкреВрд░реНрдг! Q_ClASSINFO рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдПрдбрд╛рдкреНрдЯрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдирд╛рдо рдПрдХ рдЕрд╡рдзрд┐ рд╕рдорд╛рд╣рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  4. рдкреЛрдВрдЧ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкрдВрдЬреАрдХреГрдд рди рдХрд░реЗрдВред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
      if( ! connection.registerObject("/", &pong)){ 
    рдорд╣рддреНрд╡рдкреВрд░реНрдг! рдЗрд╕ рдкрде рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - /
рдЗрд╕ рдХрд╣рд╛рдиреА рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдореЛрдбрд╝ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдо рдЙрд╕ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрд▓реЙрдЯ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ QDbusContext рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ (рдкреЛрдВрдЧ) рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА, рд╕рдВрджрд░реНрдн рд╡рд┐рдзрд┐рдпреЛрдВ, рдЕрд▓рд╛рдкрд╛ рдХреЛ рдПрдбреЙрдкреНрдЯрд░ рдореЗрдВ рдЦреАрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдЧрд░ рд╣рдо рд╣рдо рдЕрднреА рднреА рдбреА-рдмрд╕ рд╕реЗ рдЕрдореВрд░реНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп рд╕рд┐рд░рджрд░реНрдж рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИред рдмрд▓реНрдХрд┐ рдЕрдЬреАрдм рдореЛрдбрд╝, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдореБрдЭреЗ рдЗрд╕рдХреЗ рдХрд╛рд░рдг рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдЕрд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рд╣реИред

рдФрд░ рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕рдВрджрд░реНрдн рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рд╣рдо рдкреВрд░реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рджрд┐рд▓ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдФрд░ рджрд┐рд▓ рджреЛ-рдХрдХреНрд╖реАрдп рд╣реИ: рдкрд╣рд▓рд╛ рдХреИрдорд░рд╛ QDbusMessage рдпрд╛рдиреА рд╣реИ рд╡рд╣реА рд╕рдВрджреЗрд╢ рдЬреЛ рдкреНрд░рддрд┐рднрд╛рдЧреА рдПрдХреНрд╕рдЪреЗрдВрдЬ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░рд╛ рдХреИрдорд░рд╛ QDbusArgument рдФрд░ QDbusWarly рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдирдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕рдВрджреЗрд╢ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, dbusviwer рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рддрдХ рдкрд╣реБрдБрдЪрдирд╛ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 QDBusMessage message = QDBusMessage::createMethodCall(sig.mService, sig.mPath, QLatin1String("org.freedesktop.DBus.Properties"), QLatin1String("Get")); QList<QVariant> arguments; arguments << sig.mInterface << sig.mName; message.setArguments(arguments); c.callWithCallback(message, this, SLOT(dumpMessage(QDBusMessage))); QDBusInterface iface(sig.mService, sig.mPath, sig.mInterface,c); if( !iface.isValid()) qDebug()<<(QDBusError(iface.lastError()).message()); else qDebug()<<iface.property(sig.mName.toLatin1().data()); 

рд▓реЗрдХрд┐рди QDbusArgument рд╕рдВрджреЗрд╢ рдХреЗ рдЧрдарди рдХреЛ рд╕реМрдВрдкрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рджреЛ рдЪреАрдЬреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: >> >> рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдпрджрд┐ рдЖрдкрдХрд╛ рдкреНрд░рдХрд╛рд░ рдореВрд▓ рдХреНрдпреВрдЯреА рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИ:
 struct TestStructure{ int id; QString str; }; Q_DECLARE_METATYPE(TestStructure) static QDBusArgument& operator <<(QDBusArgument &argument, const TestStructure & arg) { argument.beginStructure(); argument<<arg.id<<arg.str; argument.endStructure(); return argument; } 

рдФрд░ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдкрд╣рд▓реЗ, qDBusRegisterMetaType рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВред рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ: QDbusInterface рдХреА рдорджрдж рд╕реЗ рдЖрдк рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐ рдХрд╣рддреЗ рд╣реИрдВ, рдпрджрд┐ рдпрд╣ рдПрдХ рд╢реВрдиреНрдп рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рддреЛ рд╣рдо рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд░реНрдЧ QDbusReply рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рд╡рд╣ рд╕рдм, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рднреА рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдЧреНрд░рд╣рдг рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рдордиреЗ рдХреЗрд╡рд▓ рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╣реИ рдЬрд╣рд╛рдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

Source: https://habr.com/ru/post/In185950/


All Articles