После этого qdbus видит сигнал, но при попытке вызвать из методов класса IControl «emit started();» сигнал на D-Bus не попадает. Если к нему подключить Qt-слот, то он вызывается, т.е. механизм сигналов и слотов Qt работает. Но ни dbus-monitor, ни qdbusviewer, ни другое приложение не видят вызов этого сигнала, значит, почему-то он не попадает на D-Bus. При этом правильно работает такая конструкция, посылая сигнал на D-Bus:
В документации есть функция setAutoRelaySignals(). Может она поможет.
Она всего-то делает connect для всех сигналов, совпадающих в объекте адаптора и родительском объекте. Я пробовал и использовать её, и делать connect руками, и эмитить сигналы в родительском объекте, и эмитить их прямо в адапторе (тогда никакой connect вообще не нужен) — ничего не работает. Сигнал эмитится только в пределах Qt, а на D-Bus не выходит.
Нашёл решение. Регистрировать надо было не адаптор, а родительский объект:
new IControl(&app);
QDBusConnection::sessionBus().registerObject("/", &app, QDBusConnection::ExportAllContents);
Также я заменил создание адаптора на стеке созданием в динамической памяти. Также в конструкторе, по видимому, нельзя эмитить сигналы, но в слотах emit заработал.