Сигналы и слоты. Qt использует понятия сигналов и слотов для радикального разделения различных частей программы. Сначала вы должны подключить сигнал к слоту:
connect(sender, SIGNAL(theSignal(int)), receiver, SLOT(theSlot(int)));
Затем, когда sender
"излучает" сигнал (используя, например, emit theSignal(0)
), тогда Qt организует вызов receiver->theSlot(0)
. Эта договоренность достигается "мета-объектным компилятором", отдельной программой, которая генерирует код, который вы компилируете и связываете с вашей программой.
Qt использует сигналы и слоты для ответа на события GUI. Поэтому, когда вы решаете, что делать вашей программе, когда пользователь нажимает на пункт меню «Файл-> Открыть», вы пишете слот. Qt использует мета-объектный компилятор (moc
) для предварительной обработки вашего кода и генерации большого количества машин за сценой, чтобы убедиться, что этот слот может быть подключен к сигналам. В шапке для MyMainWindow
у вас будет что-то вроде:
class MyMainWindow : public QMainWindow
{
Q_OBJECT
public:
MyMainWindow();
public slots:
void on_fileOpen_activated();
signals:
void mySignal(int n);
};
Макрос Q_OBJECT
необходим, чтобы moc
распознал класс и сгенерировал всю технику для вас. Что касается вашего кода, слот - это просто нормальный метод. Он может быть публичным, защищенным или частным. Это можно назвать нормально. Единственное отличие состоит в том, что вы можете использовать connect
для подключения к нему сигнала.
Сигналы - это другое дело. moc
реализует все ваши сигналы для вас, поэтому, продолжая приведенный выше пример, MyMainWindow.cpp
не будет включать определение mySignal
.