Hello,

I try to connect the DBus PropertiesChanged Signal with Qt and PySide6/Python, the signal has the following signature:

org.freedesktop.DBus.Properties.PropertiesChanged (STRING interface_name,
                                                   ARRAY of DICT_ENTRY<STRING,VARIANT> changed_properties,
ARRAY<STRING> invalidated_properties);

Concrete I need the signal and PropertiesChanged metadata of the MPRIS standard (https://specifications.freedesktop.org/mpris-spec/latest/, https://www.freedesktop.org/wiki/Specifications/mpris-spec/metadata/), the meta data has a dictionary in the propertieschanged dictionary and the inner dictionary has arrays as values on some entries, I can see the data by setting the environment variable "QDBUS_DEBUG": "1" or on a cross check using sdbus:

('org.mpris.MediaPlayer2.Player',
{'Metadata': ('a{sv}', {'xesam:albumArtist': ('as', ['Daft Punk', 'Pharrell Williams', 'Nile Rodgers']),             'mpris:trackid': ('o', '/spotify/track/2Foc5Q5nqNiosCNqttzHof'),             'xesam:title': ('s', 'Get Lucky (Radio Edit) [feat. Pharrell Williams and Nile Rodgers]'),             'xesam:album': ('s', 'Get Lucky (Radio Edit) [feat. Pharrell Williams and Nile Rodgers]'),
            'xesam:trackNumber': ('u', 1), 'xesam:discNumber': ('i', 1),
            'mpris:artUrl': ('s', 'https://i.scdn.co/image/ab67616d0000b2731d5cf960a92bb8b03fc2be7f'),             'xesam:url': ('s', 'https://open.spotify.com/track/2Foc5Q5nqNiosCNqttzHof'),             'mpris:length': ('x', 248413000), 'xesam:autoRating': ('d', 0.82),             'xesam:artist': ('as', ['Daft Punk', 'Pharrell Williams', 'Nile Rodgers'])}),
            'PlaybackStatus': ('s', 'Playing')},
[])

I test it currently with the DBus NetworkManager, it is simpler as it has no inner dictionary, but some arrays of objects as value and I can force the signal by enabling and disabling my network connection on Ubuntu, these are 2 example outputs:

('org.freedesktop.NetworkManager', {'ActiveConnections': ('ao', ['/org/freedesktop/NetworkManager/ActiveConnection/8'])}, [])
('org.freedesktop.NetworkManager', {'State': ('u', 40)}, [])

But for neither of the 2 I can't get the connected slot method to run, I also don't get any error.

I managed to connect to DBus signals with simple data types, but I can't get it to work with PropertiesChanged, whith the dictionaries and arrays.

I have uploaded demos on github with a Visual Studio Code project: https://github.com/Drexel2k/qdbus

This is the NetworkManager demo I want to get to work first: https://github.com/Drexel2k/qdbus/blob/main/qdbusdemo_netmanpropertieschanged.py This is a working cross check with sdbus: https://github.com/Drexel2k/qdbus/blob/main/sdbusdemo.py This is a working demo with the simple data types: https://github.com/Drexel2k/qdbus/blob/main/qdbusdemo_dbusnameownerchanged.py

For all of the 3 a debug config exists, currently for the Qt modules the QDBUS_DEBUG environment variable is set to 0, but it can be easily enabled by setting it to 1.

The documentation (https://doc.qt.io/qt-6/qdbustypesystem.html) also says:
Extending the Type System
In order to use one's own type with Qt D-Bus, the type has to be declared as a Qt meta-type with the Q_DECLARE_METATYPE() macro and registered with the qDBusRegisterMetaType() function. The streaming operators operator>> and operator<< will be automatically found by the registration system.

and:

Warning: You may not use any type that is not on the list above, including typedefs to the types listed. This also includes QList<QVariant> and QMap<QString,QVariant>.

I saw some C++ examples also using QDBusArgument and overloading the streaming operators, I don't know if this would be the solution, but I also don't know how to do this in Python.

Any help is appreciated, thank you in advance!

Best regards
Matthias

_______________________________________________
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest

Reply via email to