你不能。信号由在 DBus 接口上注册该信号的所有客户端接收。
您可以将参数添加到OnNotify
信号,并在客户端中处理它,或者为每个客户端创建单独的信号。但是,如果您希望该组件是动态的(在运行时添加客户端),则必须采用第一种方法(参数OnNotify
).
编辑:有关信号的更多信息
信号定义如下:
DBus 中的信号由一条消息组成,由一个进程发送到任意数量的其他进程。也就是说,信号是单向广播。该信号可能包含参数(数据有效负载),但由于它是广播,因此它永远不会有“返回值”。将此与方法调用进行对比(请参阅“调用方法 - 幕后”部分),其中方法调用消息具有匹配的方法回复消息。
信号的发射者(也称为发送者)不知道信号接收者。接收者向总线守护程序注册,以根据“匹配规则”接收信号 - 这些规则通常包括发送者和信号名称。总线守护进程仅将每个信号发送给对该信号表示感兴趣的接收者。
原始来源.
编辑:根据德米特里的评论更新了答案。
过滤 dbus 信号不适用于任何当前可用的绑定(没有检查所有绑定,只检查了 2 个(dbus-cpp 和 qt),因此任何人都可以跟进这一点)。
然而,可以设置DESTINATION
dbus 消息标头中的字段,使用 dbus 接口中可用的函数(dbus-message.h
):
dbus_bool_t dbus_message_set_destination (DBusMessage *message, const char *destination)
如果是 QT 绑定,您必须按如下方式修改绑定:qdbusmessage.cpp
在方法中
DBusMessage *QDBusMessagePrivate::toDBusMessage(const QDBusMessage &message, QDBusError *error)
在案例分支上DBUS_MESSAGE_TYPE_SIGNAL
你需要打电话给q_dbus_message_set_destination
.
此外,目的地必须可从上层获得。最简单的方法是延长QDBusMessage
类以保留目的地,然后将其传递到下面的 dbus 层。
如果您能够修改项目中的 QT 绑定,那么您可以进行这样的操作:)。