Qt "private slots:" что это такое?


Я понимаю, как его использовать, но синтаксис его беспокоит меня. Что делает "private slots:"?

Я никогда раньше не видел чего-то между частным ключевым словом и : в определении класса. Есть ли здесь какая-то причудливая магия 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);

 ...
3 62

3 ответа:

Слоты являются специфичным для Qt расширением C++. Он компилируется только после отправки кода через препроцессор Qt, компилятор Метаобъектов (moc). См. http://doc.qt.io/qt-5/moc.html для документации.

Edit: как указывает Фрэнк, moc требуется только для связывания. Дополнительные ключевые слова #определяются с помощью стандартного препроцессора.

Ключевые слова, такие как public, private игнорируются для слотов Qt. Все слоты фактически являются открытыми и могут быть подключены

Объявление слотов закрытыми означает, что вы не сможете ссылаться на них из контекста, в котором они являются закрытыми, как и любой другой метод. Следовательно, вы не сможете передать адрес private slots в connect.

Если вы объявляете сигнал и слот как частные, вы говорите, что только этот класс может управлять, но указатели на функциональные члены не имеют ограничений доступа :

class A{
    private:
    void e(){

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

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

Кроме этого, какие другие ответы упоминают также действительны:
- вы все еще можете подключиться частные сигналы и слоты извне с трюками
- signals и slots являются пустыми макросами и не нарушают языковой стандарт