Этот механизм работает следующим образом:
макрос Q_OBJЕСТ объявляет некоторые функции, которые необходимы для анализа внутреннего состояния и которые должны быть реализованы в каждом подклассе QObject: metaObject(), tr(), qt_metacall() и некоторые другие;
• компилятор тос генерирует реализации функций, объявленных макросом Q_OBJECT, и всех сигналов;
• такие функции-члены класса QObject, как connect() и disconnect(), во время своей работы используют функции анализа внутреннего состояния.
Все это выполняется автоматически при работе qmake, тос и при компиляции QOb j ect, и поэтому у вас крайне редко может возникнуть необходимость вспомнить об этом механизме. Однако если вам интересны детали реализации этого механизма, вы можете воспользоваться документацией по классу QMetaObject и просмотреть файлы исходного кода С++, сгенерированные компилятором тос.
До сих пор мы использовали сигналы и слоты только при работе с виджетами. Но сам по себе этот механизм реализован в классе QObject, и его не обязательно применять только в пределах программирования графического пользовательского интерфейса. Этот механизм можно использовать в любом подклассе QObject:
class Employee : public QObject {
Q_0BJECT
public:
Employee() { mySalary = 0; } int salary() const { return mySalary; } public slots:
void setSalary(int newSalary);
signals:
void salaryChanged(int newSalary);
private:
int mySalary;
};
void Employee::setSalary(int newSalary) {
if (newSalary != mySalary) { mySalary = newSalary; emit salaryChanged(mySalary);
}
}
Обратите внимание на реализацию слота setSalary(). Мы генерируем сигнал salaryChanged() только при выполнении условия newSalary ! = mySalary. Это позволяет предотвратить бесконечный цикл генерирования сигналов и вызовов слотов.
<< назад вперед >>