Все это выполняется автоматически при работе 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 на «чистом» языке С++. Все же многие программисты предпочитают применять визуальные средства проектирования форм, поскольку этот метод представляется более естественным и позволяет получать конечный результат быстрее, чем при программировании «вручную», и такой подход дает возможность программистам быстрее и легче экспериментировать и изменять дизайн.
Qt Designer расширяет возможности программистов, предоставляя визуальные средства проектирования. Qt Designer может использоваться для разработки всех или только некоторых форм приложения. Формы, созданные с помощью Qt Designer, в конце концов представляются в виде программного кода на С++, поэтому Qt Designer может использоваться совместно с обычными средствами разработки, и он не налагает никаких специальных требований на компилятор.
В данном разделе мы применяем Qt Designer для создания диалогового окна (см. рис. 2.4), которое управляет переходом на заданную ячейку таблицы (Go-to-Cell dialog). Создание диалогового окна как при ручном кодирования, так и при использовании Qt Designer предусматривает выполнение следующих шагов:
• создание и инициализация дочерних виджетов;
• размещение дочерних виджетов в менеджерах компоновки;
• определение последовательности переходов по клавише табуляции;
• установка соединений «сигнал — слот»;
• реализация пользовательских слотов диалогового окна.
Рис. 2.4. Диалоговое окно для перехода на заданную ячейку таблицы.
Для запуска Qt Designer выберите функцию Qt by Trolltech v4.x.y | Designer в меню Start системы Windows, наберите designer в командной строке системы Unix или дважды щелкните по Designer в системе Mac OS X Finder. После старта Qt Designer выдает список шаблонов. Выберите шаблон «Widget», затем нажмите на кнопку ОК. (Привлекательным может показаться шаблон «Dialog with Buttons Bottom» (диалог с кнопками в нижней части), но в этом примере мы покажем, как создавать кнопки OK и Cancel вручную.) Вы получите на экране окно с заголовком «Untitled».
По умолчанию интерфейс пользователя в Qt Designer содержит несколько окон верхнего уровня. Если вы предпочитаете интерфейс в стиле MDI с одним окном верхнего уровня и несколькими подчиненными окнами, выберите функцию Edit | User Interface Mode | Docked Window.