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 ответа:
Слоты являются специфичным для 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
являются пустыми макросами и не нарушают языковой стандарт