无法使用结构参数连接到 DBUS 信号



我正在尝试连接到 amarok d-bus 信号状态更改(参考:https://xmms2.org/wiki/MPRIS#StatusChange)。接口和结构还可以,因为我可以在同一接口中连接到简单的信号 CapsChange(int),并且可以通过 GetStatus dbus 方法获取状态,所以这个马歇尔结构是可以的:

struct AmarokStatus {
    int st1;
    int st2;
    int st3;
    int st4;
};
Q_DECLARE_METATYPE(AmarokStatus)
qDBusRegisterMetaType<AmarokStatus>();

但是当打电话时:

mInf = new QDBusInterface("org.mpris.MediaPlayer2.amarok", "/Player",
                          "org.freedesktop.MediaPlayer", QDBusConnection::sessionBus(),this);
connect(mInf, SIGNAL(StatusChange(AmarokStatus)), this, SLOT(statusChanged(AmarokStatus)));
connect(mInf, SIGNAL(CapsChange(int)), this, SLOT(capsChange(int)));

我收到消息:

对象::

连接:没有这样的信号 org::freedesktop::MediaPlayer::StatusChange(AmarokStatus)

我尝试过SIGNAL(StatusChange(struct))

和SIGNAL(StatusChange(QDbusargument))和其他类型,但相同的消息

D-Feet说StatusChange的定义是:StatusChange(Struct of (Int32, Int32, Int32, Int32)),与dbus-monitor相同。信号跟踪更改(结构数组)也有同样的问题。所以我肯定用 connect() 方法搞砸了一些东西。

有两个选项:

  1. 确保实现QDBusAbstractInterface的发射器定义了您要连接的信号。这个解决方案更干净一些。

  1. 使用 QDBusConnection::connect 连接到匿名信号。这个解决方案在紧要关头工作,但根据我的经验,可能特别容易出错:
if (!QDBusConnection::systemBus().connect("org.mpris.MediaPlayer2.amarok", "/Player", "org.freedesktop.MediaPlayer", "StatusChange", this, SLOT(statusChanged(AmarokStatus)))) {
    qWarning() << "Failed to connect";
}

相关内容

  • 没有找到相关文章

最新更新