D-Busアダプタでのスロットの宣言
D-Busアダプタ内のスロットは、通常のパブリックスロットと同様に宣言されますが、そのパラメータは特定の規則に従う必要があります(詳細については「Qt D-Bus の型システム」を参照してください)。パラメータがこれらの規則に従っていないスロット、またはパブリックではないスロットは、D-Bus経由ではアクセスできません。
スロットには、const QDBusMessage & 型のパラメータを1つ持つことができます。このパラメータは、入力パラメータリストの最後、出力パラメータの前に配置する必要があります。このパラメータが存在する場合、現在処理中のメッセージのコピーで初期化されます。これにより、呼び出し先は、接続名などの呼び出し元に関する情報を取得できるようになります。
スロットには3つの種類があります:
- 非同期
- 入力専用
- 入出力
非同期スロット
非同期スロットとは、通常、呼び出し元に対して何の応答も返さないスロットのことです。そのため、出力パラメータを受け取ることはできません。ほとんどの場合、スロットの最初の行が実行される頃には、呼び出し元関数はすでに処理を再開しています。
ただし、スロットはこの挙動に依存してはなりません。スケジューリングやメッセージディスパッチの問題により、スロットの実行順序が変わる可能性があります。呼び出し元と同期を図るコードは、独自の同期手段を用意する必要があります。
非同期スロットは、メソッドシグネチャにおいて、戻り値の型 `void ` およびスロット名の直前に、キーワード `Q_NOREPLY ` を指定することで示されます。D-Busの「Complex Ping Pong」サンプルにある `quit() ` スロットが、その一例です。
入力専用スロット
入力専用スロットは、値または定数参照で渡されるパラメータを受け取る通常のスロットです。ただし、非同期スロットとは異なり、呼び出し元は通常、呼び出し先の処理が完了するのを待ってから処理を再開します。したがって、非同期でないスロットはブロックしてはならず、あるいはドキュメント内でブロックする可能性があることを明示的に記載する必要があります。
入力専用スロットは、値渡しまたは定数参照で渡されるパラメータのみを受け取る点を除き、シグネチャに特別なマークはありません。オプションとして、スロットは最後のパラメータとして `QDBusMessage ` パラメータを受け取ることができ、これを使用してメソッド呼び出しメッセージの追加解析を行うことができます。
入力および出力スロット
入力専用スロットと同様に、入力・出力スロットとは、呼び出し側が応答を待つスロットのことです。ただし、入力専用スロットとは異なり、この応答にはデータが含まれます。データを出力するスロットは、非定数参照を含めることができ、値を返すこともできます。 ただし、出力パラメータはすべて引数リストの末尾に配置されなければならず、入力引数と交互に配置することはできません。オプションとして、入力引数と出力引数の間にQDBusMessage 引数を配置することも可能です。
自動応答
メソッドの応答は、Qt D-Bus の実装によって、出力パラメータの内容(存在する場合)を用いて自動的に生成されます。スロットは、適切なQDBusMessage オブジェクトを構築し、それを接続を介して送信することについて気にする必要はありません。
ただし、そうする可能性は依然として残っています。スロットが特別な応答やエラーを送信する必要があると判断した場合は、QDBusMessage パラメータに対してQDBusMessage::createReply()またはQDBusMessage::createErrorReply()を使用し、QDBusConnection::send()で送信することができます。スロットがそうした場合、Qt D-Bus の実装は応答を生成しません。
警告: 呼び出し側がメソッドを呼び出して応答を待機する場合 、待機時間は一定時間に限られます。処理に長時間かかることが予想されるスロットについては、呼び出し側が適切にタイムアウト時間を長く設定できるよう、その旨をドキュメントで明確に記述する必要があります。
応答の遅延
状況によっては、呼び出されたスロットがリクエストを即座に処理できない場合があります。これは、リクエストにブロックされる可能性のある I/O やネットワーク操作が含まれている場合に頻繁に発生します。
その場合は、ユーザーインターフェースがフリーズするのを防ぐため、スロットはアプリケーションのメインループに制御を戻し、後で処理を再開する必要があります。これを実現するには、入力パラメータリストの末尾にある追加のQDBusMessage パラメータを利用し、遅延応答を要求する必要があります。
これを行うには、リクエストデータを永続的な構造体に格納するスロットを記述し、QDBusMessage::setDelayedReply(true) を使用して呼び出し元に、応答は後で送信されることを示します。
struct RequestData
{
QString request;
QString processedData;
QDBusMessage reply;
};
QString processRequest(const QString &request, const QDBusMessage &message)
{
RequestData *data = new RequestData;
data->request = request;
message.setDelayedReply(true);
data->reply = message.createReply();
appendRequest(data);
return QString();
}この場合、戻り値は重要ではありません。コンパイラを満足させるために、任意の値を返します。
リクエストが処理され、応答が利用可能になったら、取得したQDBusMessage オブジェクトを使用して応答を送信する必要があります。この例では、応答コードは次のようなものになります:
void sendReply(RequestData *data)
{
// data->processedData has been initialized with the request's reply
QDBusMessage &reply = data->reply;
// send the reply over D-Bus:
reply << data->processedData;
QDBusConnection::sessionBus().send(reply);
// dispose of the transaction data
delete data;
}例からわかるように、遅延応答が設定されている場合、スロットからの戻り値はQt D-Bus によって無視されます。これらは、アダプタの記述をリモートアプリケーションに伝達する際にスロットのシグネチャを決定するため、あるいはスロット内のコードが遅延応答を使用しないことを決定した場合にのみ使用されます。
遅延応答自体は、元のメッセージに対して QDBusMessage::reply() を呼び出すことで、Qt D-Bus に要求されます。その後、呼び出し元に最終的に応答を送信するのは、呼び出されたコード側の責任となります。
警告: 呼び出し元がメソッド呼び出しを行い、応答を待機する場合 、待機時間は限られています。処理に長時間かかることが予想されるスロットについては、呼び出し元が適切にタイムアウト時間を長く設定できるよう、その旨をドキュメントで明記する必要があります。
関連項目: 「Qt D-Bus アダプタの使用」、「D-Busアダプタでのシグナルの宣言」、「Qt D-Bus の型システム」、QDBusConnection 、およびQDBusMessage 。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.