【问题标题】:Is this Qt DBus signal connection code correct?这个 Qt DBus 信号连接代码是否正确?
【发布时间】:2012-06-26 19:01:54
【问题描述】:

这是我第一次使用 DBus,所以我不完全确定我是否以正确的方式进行。我正在尝试连接 Ubuntu One DBus 服务并获取我的应用程序的登录凭据,但是我连接到 DBus 的插槽返回详细信号 here 似乎从未触发,尽管在联系。

在我开始查找与此特定服务相关的详细信息中的错误之前,有人可以告诉我此代码是否可以首先工作,或者我在这里做错了什么?

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;
}

【问题讨论】:

  • 我很惊讶你在运行代码时没有收到关于没有初始化 QCoreApplication 的警告。
  • 这实际上是实际代码的压缩版本,它确实有一个 QApplication。
  • 检查我的答案,如果有帮助请写下

标签: c++ qt ubuntu dbus


【解决方案1】:

我想你忘记跑步了

QDBusConnection QDBusConnection::connectToBus ( BusType type, 
                                                const QString & name )

然后检查

bool QDBusConnection::isConnected () const

调用前

void UbuntuOneDBus::connectReturnSignals()

或运行带有一些标志的程序,但这应该更容易。

我不想要你的目标,但也许你也应该尝试

bool QDBusConnection::registerObject ( const QString & path, QObject * object, 
                                       RegisterOptions options = ExportAdaptors )

这里有一些文档: connectToBus

isConnected

registerObject

【讨论】:

    猜你喜欢
    • 2016-10-22
    • 2015-03-16
    • 2012-09-11
    • 2016-04-20
    • 2012-05-25
    • 2016-11-03
    • 2017-08-01
    • 2017-02-24
    • 1970-01-01
    相关资源
    最近更新 更多