QT 4: программирование GUI на С++ | страница 26
Этот механизм работает следующим образом:
• макрос Q_OBJЕСТ объявляет некоторые функции, которые необходимы для анализа внутреннего состояния и которые должны быть реализованы в каждом подклассе QObject: metaObject(), tr(), qt_metacall() и некоторые другие;
• компилятор moc генерирует реализации функций, объявленных макросом Q_OBJECT, и всех сигналов;
• такие функции—члены класса QObject, как connect() и disconnect(), во время своей работы используют функции анализа внутреннего состояния.
Все это выполняется автоматически при работе qmake, moc и при компиляции QObject, и поэтому у вас крайне редко может возникнуть необходимость вспомнить об этом механизме. Однако если вам интересны детали реализации этого механизма, вы можете воспользоваться документацией по классу QMetaObject и просмотреть файлы исходного кода С++, сгенерированные компилятором moc.
До сих пор мы использовали сигналы и слоты только при работе с виджетами. Но сам по себе этот механизм реализован в классе QObject, и его не обязательно применять только в пределах программирования графического пользовательского интерфейса. Этот механизм можно использовать в любом подклассе QObject:
>01 class Employee : public QObject
>02 {
>03 Q_OBJECT
>04 public:
>05 Employee() { mySalary = 0; }
>06 int salary() const { return mySalary; }
>07 public slots:
>08 void setSalary(int newSalary);
>09 signals:
>10 void salaryChanged(int newSalary);
>11 private:
>12 int mySalary;
>13 };
>14 void Employee::setSalary(int newSalary)
>15 {
>16 if (newSalary != mySalary) {
>17 mySalary = newSalary;
>18 emit salaryChanged(mySalary);
>19 }
>20 }
Обратите внимание на реализацию слота setSalary(). Мы генерируем сигнал salaryChanged() только при выполнении условия newSalary ! = mySalary. Это позволяет предотвратить бесконечный цикл генерирования сигналов и вызовов слотов.
Быстрое проектирование диалоговых окон
Средства разработки Qt спроектированы таким образом, чтобы было приятно программировать «вручную» и чтобы этот процесс был интуитивно понятен; и нет ничего необычного в разработке всего приложения Qt на «чистом» языке С++. Все же многие программисты предпочитают применять визуальные средства проектирования форм, поскольку этот метод представляется более естественным и позволяет получать конечный результат быстрее, чем при программировании «вручную», и такой подход дает возможность программистам быстрее и легче экспериментировать и изменять дизайн.