这个Ubuntu One DBus信号连接代码正确吗?

这个Ubuntu One DBus信号连接代码正确吗?

这是我第一次使用 DBus,所以我不太确定我是否以正确的方式进行操作。我试图连接 Ubuntu One DBus 服务并获取我的应用程序的登录凭据,但是我连接到 DBus 的插槽返回了详细的信号这里尽管在连接期间返回了肯定的结果,但似乎从未被触发。

在我开始寻找与此特定服务有关的细节中的错误之前,有人能告诉我这段代码是否可以工作,或者我在这里做错了什么吗?

int main()
{
    UbuntuOneDBus *u1Dbus = new UbuntuOneDBus;
    u1Dbus->init()
}

class UbuntuOneDBus : public QObject
{
  Q_OBJECT

  QString busName;
  QString path;
  QString interface;
  QString method;
  QString signature;

  void connectReturnSignals();

private slots:
  void credentialsFound();
  void credentialsNotFound();
  void credentialsError();

public:
  UbuntuOneDBus();

  void init();
};

UbuntuOneDBus::UbuntuOneDBus()
{
  busName = "com.ubuntuone.Credentials";
  path = "/credentials";
  interface = "com.ubuntuone.CredentialsManagement";
  method = "register";
  signature = "a{ss}";

  connectReturnSignals();
}

void UbuntuOneDBus::init()
{
  QDBusMessage message = QDBusMessage::createMethodCall( busName, path, interface, method );
  QDBusConnection::sessionBus().send( message );
}

void UbuntuOneDBus::connectReturnSignals()
{
  QDBusConnection::sessionBus().connect( busName, path, interface, "CredentialsFound", this, SLOT( credentialsFound() ) );
  QDBusConnection::sessionBus().connect( busName, path, interface, "CredentialsNotFound", this, SLOT( credentialsNotFound() ) );
  QDBusConnection::sessionBus().connect( busName, path, interface, "CredentialsError", this, SLOT( credentialsError() ) );
}

void UbuntuOneDBus::credentialsFound()
{
  qDebug() << "Credentials found";
}

void UbuntuOneDBus::credentialsNotFound()
{
  std::cout << "Credentials not found" << std::endl;
}

void UbuntuOneDBus::credentialsError()
{
  std::cout << "Credentials error" << std::endl;
}

答案1

connect 方法的参数signature看起来不对。虽然看起来很奇怪,但它应该是"a{ss}"

这已经意味着“以字符串作为键并以字符串作为值的字典项数组”,因此添加的部分"(Dict of {String, String})"可能会被错误地解释。同样,CredentialsNotFoundD-Bus 信号的签名不应该是"(nothing)",而应该是一个空字符串,例如""

要熟悉 D-Bus 提供的其他数据类型,请尝试如下教程: http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html#data-types

答案2

我不完全清楚 Qt 中的插槽是如何工作的,但我的理解是,您仍然需要定义函数以具有正确的签名,以匹配 DBus 信号的签名。因此,在 Credentials Found 的情况下,它需要采用字符串键和值的哈希/映射,假设 QtDBus 自动将“a{ss}”签名转换为正确的数据类型。我怀疑这样的插槽函数还需要接受 QtDBus 本身提供的任何标准参数。

我还发现了诺基亚的这个快速教程,可能会有所帮助:http://www.developer.nokia.com/Community/Wiki/QtDbus_quick_tutorial

相关内容