44

Qt シグナルは公開または非公開にできますか? クラス内でのみ見られる内部シグナルを作成できますか?

更新:いくつかの内部シグナルを持つクラスがあります。これらのシグナルを他のクラスから見えないようにするにはどうすればよいですか (カプセル化と情報隠蔽)。

4

7 に答える 7

26

いいえ。シグナルを公開または非公開にすることはできません。Qt シグナルは保護されたクラス メソッドです。

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

#   define signals protected

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

于 2010-01-27T11:44:02.020 に答える
19

たとえば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)。信号にアクセスできる必要があるためです。

于 2011-04-07T21:53:17.130 に答える
14

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

Andrei が指摘したように、signal は protected の再定義にすぎません。つまり、signal は定義されているクラスによってのみ発行されます。

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

void emitTheSignal(...) {
  emit theSignal(...);
}
于 2010-03-05T09:16:44.003 に答える
4

Qt シグナルは、任意のオブジェクトが任意のシグナルに接続できるという意味でパブリックです。

于 2010-01-26T22:33:51.577 に答える