Qt シグナルは公開または非公開にできますか? クラス内でのみ見られる内部シグナルを作成できますか?
更新:いくつかの内部シグナルを持つクラスがあります。これらのシグナルを他のクラスから見えないようにするにはどうすればよいですか (カプセル化と情報隠蔽)。
Qt シグナルは公開または非公開にできますか? クラス内でのみ見られる内部シグナルを作成できますか?
更新:いくつかの内部シグナルを持つクラスがあります。これらのシグナルを他のクラスから見えないようにするにはどうすればよいですか (カプセル化と情報隠蔽)。
いいえ。シグナルを公開または非公開にすることはできません。Qt シグナルは保護されたクラス メソッドです。
"signals" キーワードは qobjectdefs.h で定義されています (Qt 4.6.1 では 69 行目):
# define signals protected
更新:シグナルはprotected
、Qt 4 のすべてのマイナー バージョンまでを含みます。Qt 5.0 以降はpublic
. https://stackoverflow.com/a/19130831を参照してください。
たとえばkdelibsで見られる一般的な方法は次のとおりです。
Q_SIGNALS:
#ifndef Q_MOC_RUN
private: // don't tell moc, doxygen or kdevelop, but those signals are in fact private
#endif
void somePrivateSignal();
これにより、シグナルが非公開になります。つまり、シグナルはクラス自体によってのみ発行され、そのサブクラスによって発行されることはありません。"private:" が Q_SIGNALS を上書きしないようにするには (moc は somePrivateSignal をシグナルとして認識しません)、moc の実行時にのみ定義される Q_MOC_RUN 内にあります。
編集:このアプローチは、Qt 5 ( ) で導入された新しいスタイルの接続では機能しませんconnect(a, &A::someSignal, b, &B::someSlot)
。信号にアクセスできる必要があるためです。
スロットは、パブリック、プロテクト、またはプライベートにすることができる単純なメソッドです。
Andrei が指摘したように、signal は protected の再定義にすぎません。つまり、signal は定義されているクラスによってのみ発行されます。
クラスに別のクラスからシグナルを発行させたい場合は、次のようなパブリック メソッド (またはスロット) を追加する必要があります。
void emitTheSignal(...) {
emit theSignal(...);
}
Qt シグナルは、任意のオブジェクトが任意のシグナルに接続できるという意味でパブリックです。