私はそれを使用する方法を理解していますが、その構文は私を悩ませます。 「プライベートスロット」とは何ですか?
クラス定義でprivateキーワードと:の間に何かを見たことはありません。ここでいくつかの派手なC++マジックが行われていますか?
そして、ここの例:
#include <QObject>
class Counter : public QObject
{
Q_OBJECT
public:
Counter() { m_value = 0; }
int value() const { return m_value; }
public slots:
void setValue(int value);
...
スロットは、Qt固有のC++の拡張機能です。 QtのプリプロセッサであるMeta-Object Compiler(moc)を介してコードを送信した後にのみコンパイルします。ドキュメントについては http://doc.qt.io/qt-5/moc.html をご覧ください。
編集:フランクが指摘するように、mocはリンクにのみ必要です。追加のキーワードは、標準のプリプロセッサで#定義されます。
Qtスロットでは、public
、private
などのキーワードは無視されます。すべてのスロットは実際に公開されており、接続できます
スロットをプライベートとして宣言すると、他の方法のように、スロットがプライベートであるコンテキストからスロットを参照できなくなります。したがって、プライベートスロットアドレスをconnect
に渡すことはできません。
シグナルをプライベートとして宣言すると、このクラスのみがシグナルを管理できますが、 関数メンバーポインターにはアクセス制限がありません :
class A{
private:
void e(){
}
public:
auto getPointer(){
return &A::e;
}
};
int main()
{
A a;
auto P=a.getPointer();
(a.*P)();
}
それ以外に、他の答えが言及していることも有効です:
-トリックを使用して、外部からプライベート信号とスロットを接続できます
-signals
およびslots
は空のマクロであり、言語標準に違反しません