Чтение онлайн

ЖАНРЫ

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

Саммерфилд Марк

Шрифт:

Следует отметить, что описание наследуемых функций приводится в базовом классе: например, класс QPushButton не имеет описания функции show, но это описание имеется в родительском классе QWidget. На рис. 1.8 показана взаимосвязь классов, которые использовались в этой главе.

Рис. 1.8. Дерево наследования для классов, используемых в данной главе.

Справочная документация для текущей версии Qt и нескольких более старых версий можно найти в сети Интернет по адресуНа этом сайте также находятся избранные статьи

из журнала Qt Quarterly (Ежеквартальное обозрение по средствам разработки Qt); этот журнал предназначается для программистов Qt и распространяется по всем коммерческим лицензиям.

В данной главе представлены ключевые концепции связи сигналов и слотов и компоновки графических элементов. Здесь также начал раскрываться последовательный и полностью объектно—ориентированный подход к конструированию и применению виджетов. Если вы просмотрите документацию Qt, то обнаружите, что в ней применяется единый подход, позволяющий легко понять способы применения новых виджетов; вы также обнаружите, что тщательный подбор в Qt имен функций, параметров, элементов перечислений и т.д. делает удивительно приятным и простым программирование в Qt.

Последующие главы части I построены на фундаменте, заложенном в этой главе; они показывают, как следует создавать приложения с полнофункциональным графическим интерфейсом, содержащим меню, панели инструментов, окна документов, строку состояния и диалоговые окна вместе с соответствующими функциональными средствами по чтению, обработке и записи файлов.

Стили виджетов

Показанные нами ранее экраны были взяты из системы Linux, но приложения Qt будут выглядеть привычно для любой поддерживаемой платформы. Qt имитирует изобразительные средства используемой платформы, а не делает попытки все представить средствами, принятыми в какой-то одной платформе или каким-то одним инструментарием.

Рис. 1.9. Различные стили вывода графических элементов.

В Qt/X11 и Qtopia Core по умолчанию используется стиль Plastique, который применяет плавные переходы цветов и подавление помех спектрального наложения для обеспечения современного интерфейса пользователя. Пользователи приложений Qt могут переопределять принятый по умолчанию стиль, используя опцию —style в команде запуска приложения. Например, для запуска приложения Age со стилем Motif в X11 необходимо просто задать команду

./age -style motif

в командной строке.

Рис. 1.10. Зависимые от платформы стили.

В отличие от других, стили систем Windows XP и Mac доступны только на «родных» платформах, поскольку они реализованы на базе присущих только данной платформе механизмов работы.

Глава 2. Создание диалоговых окон

В данной главе вы научитесь создавать диалоговые окна с использованием средств разработки Qt. Диалоговые окна предоставляют пользователю возможность задавать необходимые значения параметров и выбирать определенные режимы работы. Они называются диалоговыми окнами или просто «диалогами» (dialogs), поскольку представляют собой средство, с помощью которого пользователи и приложения могут «переговариваться» друг с другом.

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

таким приложением может быть калькулятор).

Первое диалоговое окно мы создадим полностью вручную, чтобы было ясно, как выглядит исходный код такой программы. Затем мы покажем способы построении диалоговых окон в Qt Designer, который является средством визуального проектирования в Qt. Использование Qt Designer позволяет получать результат значительно быстрее, чем при ручном кодировании, и полученные в нем различные варианты проектов легче тестировать и изменять в будущем.

Подклассы QDialog

Первым нашим примером будет диалоговое окно Find (найти) для поиска заданной пользователем последовательности символов, и оно будет полностью написано на С++. Мы реализуем это диалоговое окно в виде его собственного класса. Причем мы сделаем его независимым и самодостаточным компонентом, со своими сигналами и слотами.

Рис. 2.1. Диалоговое окно поиска.

Исходный код программы содержится в двух файлах: finddialog.h и finddialog.cpp. Сначала приведем файл finddialog.h:

01 #ifndef FINDDIALOG_H

02 #define FINDDIALOG_H

03 #include <QDialog.h>

04 class QCheckBox;

05 class QLabel;

06 class QLineEdit;

07 class QPushButton;

Строки 1 и 2 (а также строка 27) предотвращают многократное включение в программу этого заголовочного файла.

В строке 3 в программу включается определение QDialog — базового класса для диалоговых окон в Qt. Класс QDialog наследует свойства класса QWidget.

В строках с 4 по 7 даются предварительные объявления классов Qt, использующихся для реализации диалогового окна. Предварительное объявление (forward declaration) указывает компилятору С++ только на существование класса, не давая подробного определения этого класса (обычно определение класса содержится в его собственном заголовочном файле). Чуть позже мы поговорим об этом более подробно.

Затем мы определяем FindDialog как подкласс QDialog:

08 class FindDialog : public QDialog

09 {

10 Q_OBJECT

11 public:

12 FindDialog(QWidget *parent = 0);

Макрос Q_OBJECT необходимо задавать в начале определения любого класса, содержащего сигналы или слоты.

Конструктор FindDialog является типичным для классов виджетов в Qt. В параметре parent (родитель) указывается родительский виджет. По умолчанию задается нулевой указатель, указывающий на то, что у данного диалога нет родительского виджета.

13 signals:

14 void findNext(const QString &str, Qt::CaseSensitivity cs);

15 void findPrev(const QString &str, Qt::CaseSensitivity cs);

В секции signals объявляется два сигнала, которые генерируются диалоговым окном при нажатии пользователем кнопки Find (найти). Если установлен флажок поиска в обратном направлении (Search backward), генерируется сигнал findPrevious; в противном случае генерируется сигнал findNext .

Поделиться с друзьями: