web-dev-qa-db-ja.com

プライベート/パブリックqtシグナル

Qtシグナルをパブリックまたはプライベートにできますか?クラス内でのみ表示される内部信号を作成できますか?

pdate:内部信号を持つクラスがあります。これらの信号を他のクラス(カプセル化と情報非表示)に対して非表示にするにはどうすればよいですか?

36
anton

いいえ。信号をパブリックまたはプライベートにすることはできません。 Qtシグナルは、保護されたクラスメソッドです。

"signals"キーワードはqobjectdefs.hで定義されています(Qt 4.6.1の69行目):

#   define signals protected

UPDATE:シグナルは、protectedまでのみで、Qt 4のすべてのマイナーバージョンを含みます。Qt5.0以降では、publicです。 https://stackoverflow.com/a/19130831 を参照してください。

25
Andrei Vlasyuk

一般的な方法。 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))では機能しません。

20
Frank Osterfeld

シグナルはQt4ではprotectedでしたが、Qt5ではpublicです。 Int Qt5では、最後の引数としてprivateを追加することで、QPrivateSignalにすることができます。これについての詳細: http://woboq.com/blog/how-qt-signals-slots-work-part2-qt5.html

15
Nikita Krupenko

スロットは、パブリック、保護、またはプライベートにすることができる単純なメソッドです。

Andreiが指摘したように、シグナルは保護されたものの再定義にすぎません。つまり、シグナルは、それらが定義されているクラスによってのみ発行されます。

クラスに注釈を付けたものからシグナルを送信させたい場合は、次のようなパブリックメソッド(またはスロット)を追加する必要があります。

void emitTheSignal(...) {
  emit theSignal(...);
}
15
gregseth

Qt信号は、あらゆるオブジェクトがあらゆる信号に接続できるという意味でパブリックです。

5
Kyle Lutz

そのためにPIMPLパターンを使用できます。プライベートシグナルはプライベート実装にのみ存在します。

0
Th. Thielemann