Поскольку все функциональ­ные возможности тос обеспечиваются только с помощью «чистого» С++, ме­та-объектная система Qt будет работать с любым компилятором С++.

Этот механизм работает следующим образом:

макрос 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. Это позволяет предотвратить бесконечный цикл генерирования сигналов и вызовов слотов.


<< назад вперед >>