できません。信号は、DBusインターフェイスでその信号に登録されているすべてのクライアントによって受信されます。
シグナルにパラメーターを追加OnNotify
してクライアントで処理するか、クライアントごとに個別のシグナルを作成することができます。ただし、このコンポーネントを動的にする(実行時にクライアントを追加する)場合は、最初のアプローチ(パラメーターto OnNotify
)を使用する必要があります。
編集:信号に関する詳細情報
信号は次のように定義されます。
DBusのシグナルは、1つのプロセスから他の任意の数のプロセスに送信される単一のメッセージで構成されます。つまり、信号は単方向ブロードキャストです。シグナルには引数(データペイロード)が含まれている場合がありますが、ブロードキャストであるため、「戻り値」はありません。これをメソッド呼び出し(「メソッドの呼び出し-舞台裏」というセクションを参照)と比較してください。メソッド呼び出しメッセージには、一致するメソッド応答メッセージがあります。
信号の発信者(別名送信者)は、信号の受信者についての知識を持っていません。受信者はバスデーモンに登録して、「一致ルール」に基づいてシグナルを受信します。これらのルールには通常、送信者とシグナル名が含まれます。バスデーモンは、各信号を、その信号に関心を示した受信者にのみ送信します。
元のソース。
編集:ドミトリーのコメントに照らして回答を更新しました。
dbusシグナルのフィルタリングは、現在利用可能なバインディングでは機能しません(すべてをチェックしなかったため、2つ(dbus-cppとqt)のみであるため、誰でもフォローアップできます)。
ただし、dbusインターフェイス( )DESTINATION
で使用できる関数を使用して、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バインディングを変更できる場合は、そのような操作を行うことができます:)。