Qtシグナルをパブリックまたはプライベートにできますか?クラス内でのみ表示される内部信号を作成できますか?
pdate:内部信号を持つクラスがあります。これらの信号を他のクラス(カプセル化と情報非表示)に対して非表示にするにはどうすればよいですか?
いいえ。信号をパブリックまたはプライベートにすることはできません。 Qtシグナルは、保護されたクラスメソッドです。
"signals"キーワードはqobjectdefs.hで定義されています(Qt 4.6.1の69行目):
# define signals protected
UPDATE:シグナルは、protected
までのみで、Qt 4のすべてのマイナーバージョンを含みます。Qt5.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:"を無効にしないために(mocはsomePrivateSignalをシグナルとして認識しません)、Q_MOC_RUN内にあります。これはmocの実行時にのみ定義されます。
編集:このアプローチは、信号にアクセスできる必要があるため、Qt 5で導入された新しいスタイルの接続(connect(a, &A::someSignal, b, &B::someSlot)
)では機能しません。
シグナルはQt4ではprotected
でしたが、Qt5ではpublic
です。 Int Qt5では、最後の引数としてprivate
を追加することで、QPrivateSignal
にすることができます。これについての詳細: http://woboq.com/blog/how-qt-signals-slots-work-part2-qt5.html
スロットは、パブリック、保護、またはプライベートにすることができる単純なメソッドです。
Andreiが指摘したように、シグナルは保護されたものの再定義にすぎません。つまり、シグナルは、それらが定義されているクラスによってのみ発行されます。
クラスに注釈を付けたものからシグナルを送信させたい場合は、次のようなパブリックメソッド(またはスロット)を追加する必要があります。
void emitTheSignal(...) {
emit theSignal(...);
}
Qt信号は、あらゆるオブジェクトがあらゆる信号に接続できるという意味でパブリックです。
そのためにPIMPLパターンを使用できます。プライベートシグナルはプライベート実装にのみ存在します。