【问题标题】:How to get QDBusConnection::connect() failure reason如何获取 QDBusConnection::connect() 失败原因
【发布时间】:2016-09-15 06:11:38
【问题描述】:

我正在尝试以这种方式连接到 D-Bus 信号:

bool result = QDBusConnection::systemBus().connect(
    "foo.bar",  // service
    "/foo/bar", // path 
    "foo.bar",  // interface
    "SignalSomething",
    this,
    SLOT(SignalSomethingSlot()));

if( !result )
{
    // Why!?
}

QDBusConnection::connect() 返回一个布尔值,我如何获得扩展的错误信息?如果检查QDBusConnection::lastError() 它不会返回有用的信息(因为QDBusError::isValid()false)。

【问题讨论】:

    标签: qt dbus qtdbus


    【解决方案1】:

    我遇到了同样的问题,结果发现我连接的插槽的参数类型错误。它们必须根据 Qt 的 documentation 匹配,看起来 connect() 验证了这一点,尽管没有明确提及。

    警告:只有在参数匹配的情况下,才会将信号传送到插槽。

    我建议d-feet 列出信号并检查它们的参数类型。 dbus-monitor 也列出了信号、路径等,但并不总是列出确切的参数类型。


    一个重要的观察结果:我通过使用与实际信号不同的槽参数解决了我的特殊情况下的问题!

    我想连接到here 提到的com.ubuntu.Upstart0_6 信号,以检测 Ubuntu 中的屏幕何时被锁定/解锁。 dbusmonitor 打印以下内容,d-feet 显示参数 (String, Array of [String])

    // dbusmonitor output
    signal time=1529077633.579984 sender=:1.0 -> destination=(null destination) serial=809 path=/com/ubuntu/Upstart; interface=com.ubuntu.Upstart0_6; member=EventEmitted
       string "desktop-unlock"
       array [
       ]
    

    因此信号应该是类型

    void screenLockChangedUbuntu(QString event, QVector<QString> args) // connect() -> false
    

    然而,这使得connect() 返回false。解决方案是从槽中删除数组参数:

    void screenLockChangedUbuntu(QString event) // works
    

    我知道数组参数总是为空,但我无法解释为什么它只在删除它时才起作用。

    【讨论】:

      【解决方案2】:

      你可以试试这些技巧:

      1) 在运行应用程序之前设置 QDBUS_DEBUG 环境变量。

      export QDBUS_DEBUG=1
      

      2) 启动dbus-monitor 以查看总线上发生的情况。您可能需要设置一个全局策略才能eavesdrop 系统总线,具体取决于您的发行版。

      更新:

      您确定连接到系统总线成功了吗?如果失败,您可能应该检查system.conf 策略并可能在system.d 中创建自己的conf。这个post 可能会有所帮助。

      您可以先用QDBusConnection::connectToBus 连接到系统总线,然后用QDBusConnection::isConnected 检查它是否成功。只有在那之后,您才尝试连接到信号并检查是否成功。

      QDBusConnection bus = QDBusConnection::connectToBus(QDBusConnection::systemBus, myConnectionName);
      if (bus.isConnected())
      {
          if(!bus.connect( ... ))
          {
              // Connecting to signal failed
          }
      }
      else
      {
          // Connecting to system bus failed
      }
      

      【讨论】:

      • 我尝试了这两种技巧,但它们没有帮助,因为问题不在公共汽车上,而是在 QtDBus 内......
      • 我更新了我的答案。怀疑连接到系统总线没有成功。
      • 是的,它可以连接:我可以在同一个 D-Bus 接口上调用方法。我只是在尝试将 SLOT 连接到 D-Bus 信号时遇到错误。但我不想太具体并解决我的具体情况。我想知道是否有办法找出失败的原因。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多