Жасмин Бланшет

Книги → QT 4: программирование GUI на С++ → Подклассы 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 ().

Ключевое слово signals на самом деле является макросом. Препроцессор С++ преобразует его в стандартные инструкции языка С++ и затем передает их компилятору. Qt::CaseSensitivity является перечислением и может принимать значение Qt::CaseSensitive или Qt::CaseInsensitive.

16 private slots:

17 void findClicked();

18 void enableFindButton(const QString &text);

19 private:

20 QLabel *label;

21 QLineEdit *lineEdit;

22 QCheckBox *caseCheckBox;

23 QCheckBox *backwardCheckBox;

24 QPushButton *findButton;

25 QPushButton *closeButton;

26 };

27 #endif

В закрытой (private) секции класса мы объявляем два слота. Для реализации слотов нам потребуется большинство дочерних виджетов диалогового окна, поэтому мы резервируем для них соответствующие переменные—указатели. Ключевое слово slots, так же как и signals, является макросом, который преобразуется в последовательность инструкций, понятных компилятору С++.

← предущий раздел следующая →

Страницы раздела: 1 2 3 4 5

Публикация компанией Dropbox кода Zulip – средства общения для IT-разработчиков

20.11.2015
Одной из одобрительно встреченных программистами инициатив, реализующихся в рамках акции Hack Week, стала публикация исходного кода приложения Zulip – веб-приложения для общения между собой разработчиков в сфере IT-технологий.

Объединение ОС Android и Chrome

17.11.2015
Слухи об объединении двух крупнейших ОС компании Google, Android и Chrome, гуляют по Интернету уже более 5 лет, но до сих пор этого не случилось, хотя очевидно, что с течением времени эти ОС становятся всё более похожими: так, в последнее время появилось немало Android-устройств, к которым прилагаются клавиатуры, а Chrome OS «научилась» работать с сенсорными экранами.

Конференция Linux Piter 2015

15.11.2015
Уже почти через неделю в Санкт-Петербурге впервые в истории пройдёт конференция, посвящённая проблемам свободного программного обеспечения – Linux Piter 2015.