I'm working on an app that needs to invoke methods in
various D-Bus services asynchronously, so I wrote this small program to
test the basic machinery:


  from PyQt4 import QtCore, QtDBus

  class DeviceInterface(QtDBus.QDBusAbstractInterface):

      def __init__(self, service, path, connection, parent=None):
          super().__init__(service, path,
                           'org.freedesktop.UDisks.Device',
                           connection, parent)

      @QtCore.pyqtSlot(QtDBus.QDBusArgument)
      def callFinishedSlot(self, arg):
          print("Got result:", arg)


  if __name__ == '__main__':
      import sys
      app = QtCore.QCoreApplication(sys.argv)

      dev = DeviceInterface('org.freedesktop.UDisks.Device',
                            '/org/freedesktop/UDisks/Device/sda1',
                            QtDBus.QDBusConnection.systemBus(), app)

      async = dev.asyncCall("FilesystemListOpenFiles");
      watcher = QtDBus.QDBusPendingCallWatcher(async, dev)
      watcher.finished.connect(dev.callFinishedSlot)
      sys.exit(app.exec_())


It seems to work(?) Anyway, it prints:

  Got result: <PyQt4.QtDBus.QDBusPendingCallWatcher object at 0xb740c77c>

The trouble is, I can't figure out how to get results out of the
QDBusPendingCallWatcher object.  The C++ code I adapted the above
example from does this:

   void MyClass.callFinishedSlot(QDBusPendingCallWatcher *call)
   {
       QDBusPendingReply<QString, QByteArray> reply = *call;
       if (reply.isError()) {
           showError();
       } else {
           QString text = reply.argumentAt<0>();
           QByteArray data = reply.argumentAt<1>();
           showReply(text, data);
       }
       call->deleteLater();
   }

Can anyone suggest how I might convert the C++ slot syntax to something
that will work with PyQt?  Thanks!
_______________________________________________
PyQt mailing list    PyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

Reply via email to