LINUX.ORG.RU

[qt][dbus] Не отправляются сигналы

 ,


0

1

Использую QDBusAbstractAdaptor, объявлен сигнал started():

class IControl: public QDBusAbstractAdaptor {
        Q_OBJECT
        Q_CLASSINFO("D-Bus Interface", "org.ude.application")

        // <...>

signals:
        void started();
}
Регистрирую интерфейс в main():
QDBusConnection::sessionBus().registerObject("/", &interfaceControl, QDBusConnection::ExportAllContents);
После этого qdbus видит сигнал, но при попытке вызвать из методов класса IControl «emit started();» сигнал на D-Bus не попадает. Если к нему подключить Qt-слот, то он вызывается, т.е. механизм сигналов и слотов Qt работает. Но ни dbus-monitor, ни qdbusviewer, ни другое приложение не видят вызов этого сигнала, значит, почему-то он не попадает на D-Bus. При этом правильно работает такая конструкция, посылая сигнал на D-Bus:
QDBusConnection::sessionBus().send(QDBusMessage::createSignal("/", "org.ude.application", "started"));
Собственно, ЧЯДНТ и как сделать, чтобы emit посылал сигнал и на D-Bus? Судя по документации на сайте, он это таки должен делать.

★★★★★

Последнее исправление: gentoo_root (всего исправлений: 1)
Ответ на: комментарий от stack_protector

В документации есть функция setAutoRelaySignals(). Может она поможет.

Она всего-то делает connect для всех сигналов, совпадающих в объекте адаптора и родительском объекте. Я пробовал и использовать её, и делать connect руками, и эмитить сигналы в родительском объекте, и эмитить их прямо в адапторе (тогда никакой connect вообще не нужен) — ничего не работает. Сигнал эмитится только в пределах Qt, а на D-Bus не выходит.

gentoo_root ★★★★★
() автор топика

Нашёл решение. Регистрировать надо было не адаптор, а родительский объект:

new IControl(&app);
QDBusConnection::sessionBus().registerObject("/", &app, QDBusConnection::ExportAllContents);
Также я заменил создание адаптора на стеке созданием в динамической памяти. Также в конструкторе, по видимому, нельзя эмитить сигналы, но в слотах emit заработал.

gentoo_root ★★★★★
() автор топика
Ответ на: комментарий от gentoo_root

Точнее, даже так:

new IControl(&app);
QDBusConnection::sessionBus().registerObject("/", &app);

Иначе экспортируется куча методов из QApplication, которые не должны быть видны снаружи, но не экспортируются методы адаптора.

gentoo_root ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.