Рис. 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);