Добавьте QObject в основной цикл QT для получения сообщений dbus - PullRequest
0 голосов
/ 27 июня 2018

У меня есть консольное приложение Qt. В этом приложении есть объект типа «my_client». Объекты my_client имеют слот с именем messageSlot. Этот слот подключен к сообщению DBUS.

Итак, основная функция этого приложения qt следующая:

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    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;
    }

    if (!QDBusConnection::sessionBus().registerService("org.brlapi.server"))
    {
        fprintf(stderr, "%s\n",
                qPrintable(QDBusConnection::sessionBus().lastError().message()));
        std::cout << qPrintable(QDBusConnection::sessionBus().lastError().message())
                  << std::endl;
        exit(1);
    }
    my_client client;
    new myClassAdaptor(&client);
    QDBusConnection::sessionBus().registerObject("/", &client);

    QDBusConnection::sessionBus().connect("org.my.server",
                                          "/",
                                          "org.my.server",
                                          "message",
                                          &client,
                                          SLOT(my_client::messageSlot(QString, QString)));   

    return a.exec();
}

И my_client выглядит следующим образом:

class my_client : public QObject
{
    Q_OBJECT

public:
    my_client()
    {

    }

private slots:
    void messageSlot(QString msg1, QString msg2)
    {
        std::cout << "CLIENT : I've received a message : " << msg1.toStdString()
                  << "," << msg2.toStdString() << std::endl;
        QDBusMessage msg = QDBusMessage::createSignal("/", "org.my.server", "message");
        msg << "Hello!!!" << "Are you ok?";
        QDBusConnection::sessionBus().send(msg);
    }
};

Но с этим кодом я не могу получить сообщение DBUS. Я думаю, что проблема в том, что клиентский объект не имеет основного цикла и поэтому не может принимать сигналы.

Я прав? Если так, как мы можем добавить объект клиента в основной цикл? и если нет, то в чем проблема с этим кодом? как я могу получать сообщения dbus и обрабатывать их с помощью сигнала / слота QT?

...