Qt "частные слоты": что это? - PullRequest
       3

Qt "частные слоты": что это?

69 голосов
/ 05 февраля 2012

Я понимаю, как его использовать, но его синтаксис беспокоит меня. Что делает "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 ]

50 голосов
/ 05 февраля 2012

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

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

16 голосов
/ 05 февраля 2012

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

3 голосов
/ 23 февраля 2017

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

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

class A{
    private:
    void e(){

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

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

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

...