LINUX.ORG.RU

D-Bus в Qt

 , , ,


0

1

Здравствуйте. Мне потребовалось использование D-Bus в проекте для того, чтобы перезапустить панель из control center'а, использовать StatusNotifierItem и пр. Когда пытался реализовать SNI, обнаружил, что LxQt, например, создает сервис org.kde.StatusNotifierWatcher, используя интерфейс, который прописан в org.kde.statusnotifierwatcher.xml. Там он преобразован с помощью qdbusxml2cpp. Сейчас пытаюсь реализовать не SNI, а просто возможность передать сигнал панели, что ее нужно перезапустить (точнее, снова прочитать конфиги после сохранения настроек в control center). Прочитал множество доков по QtDBus. Пытался создавать сервис в session bus (QDBusConnection.registerService). Посмотрел по qdbusviewer, он там появился. Но я не понимаю, как указать, что нужно использовать конкретный xml в качестве интерфейса и где писать реализацию методов (как использовать QDBusInterface)?

org.plainDE.plainPanel.xml

<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
	<interface name="org.plainDE.plainPanel">
		<method name="UpdateConfig"></method>
	</interface>
</node>

Читал также пример Ping-Pong на QtDBus. Насколько я понимаю, в серверной части нужно создать QDBusConnection::sessionBus(), зарегистрировать сервис, затем зарегистрировать объект и ожидать вызовов функций, но вопрос с интерфейсами и реализацией.


с xml я не работал, код только на плюсах. Для создания адаптера нужно просто класс отнаследовать от QDBusAbstractAdaptor, в заголовочном файле добавить Q_CLASSINFO("D-Bus Interface", "org.plainDE.plainPanel"), публичные методы будут экспортироваться в интерфейс сами по себе. Сервис потом регистрировать что то вроде

QDBusConnection bus = QDBusConnection::sessionBus();
bus.registerService(service);
bus.registerObject(path, new Adapter(), QDBusConnection::ExportAllContents);

Со стороны клиента что то вроде

    QDBusConnection bus = QDBusConnection::sessionBus();
    QDBusMessage request = QDBusMessage::createMethodCall(service, path, interface, command); // interface из Q_CLASSINFO, метод - название метода в твоем адаптере
    request.setArguments(args);
    
    QDBusMessage response = bus.call(request);
    QList<QVariant> arguments = response.arguments();

код старый, да и писать я не умел особо, но, кажется, работает

arcanis ★★★★
()