web-dev-qa-db-ja.com

Qt "プライベートスロット:"これは何ですか?

私はそれを使用する方法を理解していますが、その構文は私を悩ませます。 「プライベートスロット」とは何ですか?

クラス定義で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);

 ...
69
Justin

スロットは、Qt固有のC++の拡張機能です。 QtのプリプロセッサであるMeta-Object Compiler(moc)を介してコードを送信した後にのみコンパイルします。ドキュメントについては http://doc.qt.io/qt-5/moc.html をご覧ください。

編集:フランクが指摘するように、mocはリンクにのみ必要です。追加のキーワードは、標準のプリプロセッサで#定義されます。

50
Russell Davis

Qtスロットでは、publicprivateなどのキーワードは無視されます。すべてのスロットは実際に公開されており、接続できます

16
Andrew

スロットをプライベートとして宣言すると、他の方法のように、スロットがプライベートであるコンテキストからスロットを参照できなくなります。したがって、プライベートスロットアドレスをconnectに渡すことはできません。

シグナルをプライベートとして宣言すると、このクラスのみがシグナルを管理できますが、 関数メンバーポインターにはアクセス制限がありません

class A{
    private:
    void e(){

    }
    public:
    auto getPointer(){
        return &A::e;   
    }
};

int main()
{
    A a;
    auto P=a.getPointer();
    (a.*P)();
}

それ以外に、他の答えが言及していることも有効です:
-トリックを使用して、外部からプライベート信号とスロットを接続できます
-signalsおよびslotsは空のマクロであり、言語標準に違反しません

3
Euri Pinhollow