Я понимаю, как им пользоваться, но меня беспокоит его синтаксис. Что делает "приватные слоты:"?
Я никогда раньше не видел чего-то между ключевым словом 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);
...
c++
qt
signals-slots
Джастин
источник
источник
slots
определяется как#define slots
. При компиляции с использованием Qt MOC он генерирует код для компилятора C ++.Ответы:
Слоты - это специфичное для Qt расширение C ++. Он компилируется только после отправки кода через препроцессор Qt, компилятор мета-объектов (moc). См. Http://doc.qt.io/qt-5/moc.html для документации.
Изменить: как указывает Фрэнк, moc требуется только для связывания. Дополнительные ключевые слова # определены стандартным препроцессором.
источник
slots
ключевое слово необходимо? Я пробовал скомпилировать / связать несколько крошечных программ Qt, которые вызывают слоты безslots
ключевого слова, и они отлично построились. Мои эксперименты показывают, что:signals:
определенно необходимо,slots
может быть ненужным иemit
кажется ненужным, как я читал в другом месте.slots
не требуется в Qt5. Qt обновилconnect()
синтаксис, чтобы можно было подключать сигнал к произвольной функции, включая лямбды. Из-за этого в этомslots
нет необходимости. Однакоslots
ключевое слово по-прежнему влияет на способ построения объектаQMetaObject
.moc
(он же «компилятор метаобъектов») не распознает метод как слот, если он не находится вslots:
разделе определения класса. Таким образом, хотя соединение будет работать, метод не будет отображаться в инструментах самоанализа.Ключевые слова, такие как
public
,private
игнорируются для слотов Qt. Все слоты общедоступны и могут быть подключеныисточник
this
таким способом, с которым мы знакомы.Объявление слотов частными означает, что вы не сможете ссылаться на них из контекста, в котором они являются частными, как и любой другой метод. Следовательно, вы не сможете передать адрес приватных слотов
connect
.Если вы объявляете сигнал закрытым, вы говорите, что только этот класс может управлять им, но указатели на члены функций не имеют ограничений доступа :
class A{ private: void e(){ } public: auto getPointer(){ return &A::e; } }; int main() { A a; auto P=a.getPointer(); (a.*P)(); }
Помимо этого, то, что упоминается в других ответах, также действительно:
- вы все равно можете подключать частные сигналы и слоты извне с помощью трюков
-
signals
иslots
являются пустыми макросами и не нарушают языковой стандартисточник
slots
полезным утверждение, что это макрос. Я не могу подключить частные указатели-функции-слотыconnect
без хитростей, можно?