QT 4: программирование GUI на С++ - [13]

Шрифт
Интервал

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

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

• макрос 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 на «чистом» языке С++. Все же многие программисты предпочитают применять визуальные средства проектирования форм, поскольку этот метод представляется более естественным и позволяет получать конечный результат быстрее, чем при программировании «вручную», и такой подход дает возможность программистам быстрее и легче экспериментировать и изменять дизайн.

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.

На первом этапе создайте дочерние виджеты и поместите их в форму. Создайте одну текстовую метку, одну строку редактирования, одну (горизонтальную) pacпорку (spacer) и две кнопки. При создании любого элемента перенесите его название или пиктограмму из окна виджетов Qt Designer на форму приблизительно в то место, где он должен располагаться. Элемент распорка, который не будет видим при работе формы, в QtDesigner


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.