Чтобы посмотреть этот PDF файл с форматированием и разметкой, скачайте его и откройте на своем компьютере.
Московский государственный технический университет имени Н.Э. Ба
у
мана
Факультет Информатика и системы управления
Кафедра Компьютерные системы и сети
©УТВЕРЖДАЮª
ЗАВЕДУЮЩИЙ КАФЕДРОЙ
ИУ
-
6
___________ Сюзев В.В.
Г.С. Иванова
СОЗДАНИ
Е ПОЛЬЗОВАТЕЛЬСКИХ И
НТЕРФЕЙСОВ
В ПРОГРАММАХ НА С++
С ИСПОЛЬЗОВАНИЕМ
БИБЛИОТЕКИ
QT
Учебное пособие по дисциплин
ам
©
Объектно
-
ориентированное
программированиеª,
©Сис
темное программное обесп
е
чениеª
МОСКВА 2011
АНН
ОТАЦИЯ
Учебное пособие содержит описание средств
создания графических оконных пол
ь-
зовательских интерфейсов к программам, написанным на
языке
С++
.
Под
Windows
при
программировании в ранних версиях среды
Microsoft
Visual
Studio
для этой цели традиц
и-
онно испо
льзовалась библиотека
MFC
.
Однако эта библиотека была изначально рассчит
а-
на не на объектное, а на структурное программирование, и, соответственно, ее примен
е-
ние при объектном программировании излишне трудоемко, а используемые абстракции
–
во
с
принимаются, к
ак
искусственны
е
.
Библиотека
Qt
фирмы
Nokia
лишена этого недостатка, кроме того она является мн
о-
гоплатформенной и, помимо
Windows
, поддерживает
Linux
,
Mac
OS
X
,
Solaris
,
AIX
,
Irix
и
другие клоны
Unix
с
X
11,
что очень важно при современном состоянии прог
раммиров
а-
ния в этих операционных сист
е
мах.
Пособие предназначено для студентов 1 курса кафедры ©Компьютерные системы и
сетиª (ИУ6) и студентов, обучающихся по аналогичной программе на Аэрокосмическом
факультете университета (АК5
), которые изучают С++ в кач
естве второго языка програ
м-
мирования и уже знакомы со структурой библиотеки
VCL
. Однако пособие может быть
полезно и студентам
других
, изучающим С++ в качестве первого языка программиров
а-
ния
или самостоятельно
. При первом знакомстве с материалом разделы, о
тмеченные зве
з-
дочкой, целесообразно опу
с
тить.
Оглавление
Глава 1 Основы создания приложений с использованием классов библиотеки
Qt
.......
5
1.1 Структура простейшей программы с
Qt
интерфейсом
................................
...........
5
1.1.1 Создание интерфейса из совокупности объектов библиотечных классов
....
5
1.1.2 Разработка собственного класса окна приложения
................................
.........
8
1.1.3 Создание русскоязычного интерфейса в
Qt
................................
.....................
9
1.2 Особенности компиляц
ии
-
сборки программ, использующих библиотеку
Qt
...
11
1.2.1 Сборка приложений в командном режиме
................................
.....................
12
1.2.2 Сборка
Qt
-
программ в среде
Microsoft
Visual
Studio
................................
....
14
1.2.3
Qt
Designer
. Быстрая разработка прототипов интерфейсов
..........................
15
1.2.4 Интегрированная среда разработ
ки
Qt
Creator
................................
..............
23
1.3 Информационная поддержка библиотеки
Qt
Assistant
................................
.........
28
Глава 2 Средства библиотеки
Qt
................................
................................
............................
30
2.1 Виджеты и их свойства
................................
................................
............................
30
2.2 Управление расположением виджетов в окне
................................
......................
33
2.3 Меха
низм слотов и сигналов
................................
................................
..................
37
2.3.1 Создание новых слотов и установка связи сигналов со слотами
.................
37
2.3.2 Генерация новых сигналов
................................
................................
...............
41
2.4 Обработка событий. Рисование. События таймера
................................
..............
44
Литература
................................
................................
................................
................................
..
51
Приложение А. Установка Qt на компьютер
................................
................................
.......
52
Введение
Qt
–
это библиотека классов C++ и набор инструментального программного обесп
е-
чения, предназначенные для построения многоплатформенных приложений с графич
е-
ским интерфе
йсом. Она позволяет создавать приложения, которые могут работать под
управлением Windows 95/98/Me/2000/XP
/
Vista
/
Windows
7
, Mac OS X, Linux, Solaris, HP
-
UX и др
у
гих версий Unix
.
В состав
библиотеки классов
Qt
входят:
классы, обеспечивающие
построение
оконно
го графического интерфейса польз
о-
вателя;
классы для работы с 2
-
х и 3
-
х мерной графикой
;
классы
,
реализующие поддержку
основных
графических форматов хранения
из
о
бражений
;
классы
-
шаблон
ы
динамических массивов и других структурных типов данных
;
классы
для
ра
бот
ы
с
процессами и потоками
;
классы для работы с
XML
и пр.
Краткая и
стория создания
библиотеки
.
Работа над библиотекой была начата
Ха
а
вардом Нордом (главный управляющий Trolltech) и Эриком Чамбенгом (президент
комп
а
нии Trolltech) в 1990 г. К 1993 году они
завершили разработку первого графическ
о-
го ядра и приступили к созданию визуальных компонентов
–
виджетов
(widgets). 4 марта
1994 г
о
да ими была зарегистрирована компания под названием "Quasar Technologies", к
о-
торое затем было преобразовано в "Troll Tech",
а з
а
тем и в "Trolltech".
Первый выход в свет библиотеки Qt состоялся в мае 1995 года. Qt тогда могла раб
о-
тать как под управлением Windows, так и под управлением Unix, предоставляя разрабо
т-
чикам единый API (Прикладной Интерфейс). Библиотека была выпущена п
од двумя л
и-
цензиями: коммерческой
–
для разработки коммерческого пр
о
граммного обеспечения и
свободной
–
для разработки программ с открытым исходным кодом.
Завоевание рынка происходило медленно, но количество приверженцев
библиотеки
неуклонно росло. Из года
в год компания ежегодно удваивала количество продаж. Успех
обеспечивался высоким качеством библиотеки
, стройной, хорошо продуманной структ
у-
рой компонентов
и простотой
их
применения
. Менее чем за десятилетие Qt превратилась
из малоизвестной библиотеки в пр
ограммный продукт,
используемый
тысячам
и
и тыс
я-
чам
и
разработчиков во всем мире.
Наиболее известными примерами разработки на Qt я
в-
ляются: программа
-
коммуникатор Skype, м
е
ди
а
-
плеер VLC,
Earth
.
В настоящее время
фирма
Trolltech
влилась в хорошо известн
ую на рынке фирму
Nokia, кот
о
р
ой
теперь
и принадлежит библиотека
Qt.
В связи с этим библиотека может
использоваться для создания приложений под операционную систему мобильных телеф
о-
нов
Nokia
–
Symbian
и
Windows
Mobile
.
ГЛАВА 1
ОСНОВЫ
СОЗДАНИЯ
ПРИЛОЖЕНИЙ
С ИСПОЛЬЗ
ОВ
А-
НИЕМ КЛАССОВ БИБЛИОТ
ЕКИ
QT
Значительная
часть классов библиотеки
Qt
использует
отсутствующие в
языке
С++
средства
,
реализация которых
требует применения
дополнительного препроцессора
–
м
е-
та
-
объектного компилятора (
MOC
).
Следовательно, прежде, чем програ
мма, использу
ю-
щая классы
Qt
, будет передана препроцессору и компилятору
языка
С++
,
ее должен обр
а-
ботать
MOC
.
Разработчики библиотеки
предусматривают
несколько
технологий
создания пр
о-
грамм с использованием библиотеки классов
Qt
.
Всего фирма поддерживает три
варианта:
создание файлов программы в
любых
текстовых редакторах без специализир
о-
ванных сред и их компиляция, компоновка,
запуск и
отладка ©вручнуюª в к
о-
мандном режиме операционной системы;
создание программы ©под
Windows
ª в среде
Microsoft
Visual
Studio
(
начиная с
версии
2008
г.
)
, при этом, как в ручном варианте, не поддерживается визуальное
построение интерфейса, но используется возможность работы в текстовом реда
к-
торе
Visual
Studio
, а также отладка программ с использованием встроенного в
среду отладчик
а
;
создание программы в специализированной
полноценной
многоплатформенной
среде
Qt
Creator
,
полностью обеспечивающей процесс создания приложений для
наиболее
распространенных
операционных систем:
Windows XP
/
Vista
/
Windows
7
, Mac OS X, Linux, Solaris, HP
-
UX и других версий Unix
.
Поддерживаются и различные комбинации вариантов. Так фирма предоставляет о
т-
дельно от среды
Qt
Creator
средство визуальной разработки интерфейсов приложений
–
Qt
Designer
. Это средство
может использо
ваться как
при работе вне сред пр
ограммир
о
вания
,
так и на подготовительном этапе перед передачей проекта в
Visual
Studio
.
1.1
Структура
простейшей
программы с
Qt
интерфейсом
Создание интерфейса с применением средств библиотеки
Qt
продемонстрируем на
программе, выдающей на экран традиционное п
риветствие ©
Hello
!ª
или в русскоязычном
варианте ©Привет!ª.
1.1.1
Создание интерфейса из совокупности объектов библиотечных классов
Библиотека
Qt
предоставляет разработчику множество уже готовых интерфейсных
компонентов, которые в
Qt
, как и в
Linux
, принято н
азывать
виджетами
.
В простейшем случае виджеты
Qt
могут встраиваться в программный код без п
о-
строения специального класса, объект которого соответствовал бы окну.
Традиционно интерфейс приложения
Hello
выдает на экран
приветствие и
ожидает
сигнала
заверше
ния работы.
В оконном варианте это предполагает использование некот
о-
рого элемента, который может визуализировать строку приветствия, например метки, и
кнопки завершения.
При нажатии на
эту
кнопку приложение должно завершать свою р
а-
боту (см. р
и
сунок 1.1).
Рисунок
1
.
1
–
Вид окна приложения
Пример 1.1.
Приложение
Hello
.
Интеграция объектов классов
Qt
б
ез построения
специального
класса окна.
В начале программы посредством оператора
#
include
подключаем заголов
очный
файл модуля, содержащего описание используемых интерфейсных классов
Qt
.
Аналогично любой, построенной по объектной технологии и событийно управля
е-
мой программе приложение
Hello
минимально
должно
включать два объекта
:
объект
-
приложение;
объект
-
окна п
риложения.
Объект
-
приложение создается как объект класса
QApplication
.
Объекты этого
класса отвечают за создание и инициализацию главного окна, а также за запуск цикла о
б-
работки с
о
общений от операционной системы.
В качестве окна приложения будем использова
ть объект класса
.
Класс
–
базовый класс всех виджетов. Его объекты обладают свойствами контейнера,
который управляет виджетами
визуальных компонентов:
метками, кнопками и др., разм
е-
щенными в о
к
не.
Кроме этого нам понадобится
объект
класса
QLabel
–
метка
–
виджет
, с помощью
которого высвечивается текст приветствия
и
объект
класса
QPushButton
–
кнопка
–
в
и-
джет
, который используется для закрытия прилож
е
ния
.
Текст программы выглядит следующим образом:
#include
QtGu;i000;QtGui
int
main(
int
argc,
char
*ar
gv[])
{
QApplication app(argc,argv);
// создание объекта
-
приложения
// создание объекта управления окном
"Hello"
);
// изменение заголовка окна
QLabel *helloLabel=
new
QLabel(
"Hello!"
,&
win);
//
создание
метки
QPushButton *exitButton=
new
QPushButton(
"Close"
,&win);
//
создание
кнопки
QHBoxLayout *layout =
new
QHBoxLayout(&win);
//
создание
// менеджера
компоновки д
ля управления размещением метки и кнопки в окне win
layout
-
// добавление метки к компоновщику
layout
-
// добавление кнопки к компоновщику
// связь сигнала нажатия кнопки с закрытием о
кна win
QObject::connect(exitButton,
SIGNAL
(clicked(
bool
)),
&win,
SLOT
(close()));
win
.
show
();
//
визуализация
окна
win
app.exec();
// запуск цикла обработки сообщений приложения
}
Помимо уже указанных объектов
окна,
метки и кнопки
приложение включает та
к
же
объект
класса
Q
H
BoxLayout
–
горизонтальный менеджер
компоновк
и
,
отвечающий за
размещение
и масштабирование
подчиненных виджетов: метки и кнопки в окне прилож
е-
ния
.
Э
тот объект срезу при созд
а
нии связывается с оконным
объектом
win
:
QVBoxLayout
*
layout
=
new
QVBoxLayout
(
&
win
);
А затем ему передается управление
размерами и
размещением метки и кнопки:
layout
-
(
helloL
abel
);
layout
-
(
exitB
utton
);
Особого
внимания
заслуживает
оператор
(макр
ос)
Qt
connect
, который связывает
сигнал
нажатия кнопки
exitB
utton
–
clicked
(
bool
)
с его обработч
и
ком
:
QObject::connect(
exitB
utton,SIGNAL(clicked(bool)),
&
win
,
SLOT
(
close
()));
Таким обработчиком
–
слотом
окна
win
–
является метод закрытия о
кна
win
–
close
()
.
По правилам оконных приложений этот метод
обеспечивает не только закр
ы-
тие окна, но и завершение приложения
, если закрываемое окно
–
после
д
нее
.
Все объекты создаются в основной программе (см. рисунок 1.
2
,
а
), но при этом в
и-
д
жет окна назн
ачается контейнером для всех остальных и управляет видимостью видж
е-
тов и памятью всех объектов
Qt
. Поэтому для визуализации окна с меткой и кнопкой д
о-
ст
а
точно
вызва
ть
метод
Show
()
окна
win
, который обеспе
чи
т визуализацию, как самого
о
к
на, так и управляемых
им видж
е
тов
(см. рисунок 1.
2
,
б
)
.
Рисунок
1
.
2
–
Управление
объект
ами
Qt
в процессе работы программы:
а
–
с
о
здание виджетов основной программой,
б
–
управление видимостью видже
тов через контейнер окна
;
в
–
управление изменением размеров виджетов посредством менеджера компоновки
;
г
–
освобождение п
а-
мяти через ко
н
тейнер окна ()
После
визуализации окна
выполняется метод
app.exec()
,
который запускается
цикл обработки сообщений, орг
анизуя работу пр
и
ложения.
М
енеджер
компоновки
окна
, как и само окно,
является
контейнером
, но только для
включенных в него виджетов
метки и кнопки
. Он
управляет изменением размеров
подч
и-
ненных виджетов
при изменении размеров окна
(см. рис
у
нок 1.
2
,
в
)
.
Посл
е завершения программы
для освобождения всей динамически распределенной
памяти достаточно
посредством
оператора
запросить
освобождение памяти
окна
win
. Деструктор этого объекта
-
контейнера автоматически освободит все управляемые им
виджеты
(см. р
и
сун
ок 1.
2
,
г
)
и прочие компоненты
.
1.1.2
Разработка собственного класса окна приложения
Анализ диаграмм, приведенных на рисунке 1.1, показывает, что практически все
управление компонентами
окна, кроме их создания, реализуется программой не напр
я-
мую, а с использова
нием управляющего контейнера
–
окна. Поэтому более логично и с
о-
з
дание подчиненных компонентов возложить на виджет окна, для чего необходимо с
о-
зд
а
ть
специальн
ый
класс окна.
Пример 1.
2
.
Приложение
Hello
.
П
роектирование
Qt
интерфейса с использованием
специаль
н
ого
класс
а
окна.
Класс окна обычно наследуется от одного из классов
Qt
.
В нашем случае
, как и в
первом примере,
наследование будем выполнять от класса
QWidget
(см. рис
у
нок 1.
3
).
Рисунок
1
.
3
–
Диаграмма классов приложения
Hello
При наследовании управляемые окном виджеты Кнопка и Метка будут включены в
проектируемый класс в качестве указателей на объекты соответствующих классов. Отн
о-
шение между классами компонентов и проектируем
ым классом
–
наполнение
.
Несколько более сложная ситуация с менеджером компоновки. Объект этого класса
работает
только
в конструкторе
класса окна и более нигде не используется. Поэтому ц
е-
лесообразно объявлять и создавать этот объект только в конструкторе
проектируемого
класса в качестве локальной переменной. Такое решение позволит сократить количество
объектных п
о
лей класса окна и, соответственно, упростить его описание.
Компоновать приложение будем по схеме, рекомендуемой
для программ на
языке
С++ (см. ри
сунок 1.
4
):
файл
hello
.
h
будет содержать описание интерфейсного класса
окна
,
файл
hello
.
cpp
–
реализацию методов
этого
класса,
файл
main
.
cpp
–
основную програ
м
му.
Рисунок
1
.
4
–
Диаграмма компоновки приложения
Hello
Файл
win
.
h
с описанием класса окна
:
#ifndef
hello_h
#define
hello_h
#include
QtGu;i000;QtGui
class
Win:
public
{
QLabel *helloLabel;
QPushButton *exitButton;
public
:
};
#endif
П
римечание
.
Для предотвращения повторной компиляции этого файла используется
стандартный прием: в начале стоит проверка
существования
переменной
win
_
h
препроцессора
.
Е
сли
эта переменная
задана, то файл уже был компилирован, если не задана
–
то переменная
оп
ределяется
, а
файл компилируется.
Файл
win
.
cpp
содержит описание конструктора класса
Win
:
#include
"hello.h"
{
"Hello"
);
helloLabel=
new
QLabel(
"Hello!"
,
this
);
exitButton=
new
QPushButton(
"
Exit"
,
this
);
QHBoxLayout *layout =
new
QHBoxLayout(
this
);
//
создание
элемента
// компоновки для управления размещением метки и кнопки в окне win
layout
-
// добавление метки к компоновщику
layout
-
exitButton);
// добавление кнопки к компоновщику
// связь сигнала нажатия кнопки и слота закрытия окна
connect(exitButton,
SIGNAL
(clicked(
bool
)),
this
,
SLOT
(close()));
}
Файл
main
.
cpp
содержит
основную программу
:
#include
"h
ello.h"
int
main(
int
argc,
char
*argv[])
{
QApplication app(argc, argv);
Win win(0);
win.show();
app.exec();
}
Несмотря на то, что программа получилась
более
длинн
ой
, с точки зрения
технологии
она
грамотнее
построена и
, следоват
ельно,
в ней проще разбираться
, что
особенно важно при
разработке
больших программ
.
1.1.3
Создание русскоязычн
ого
интерфейс
а
в
Qt
Проблема неправильного отображения русских букв в интерфейсах программ на
языке
С++ связана с тем, что при
вводе
программы выводимы
е строки представлены в к
о-
дировке
Windows
-
1251
(
стандартная 8
-
битная кодировка русских версий
Windows
)
, а на
э
к
ране при запуске программ
в операционной системе
Windows
–
в кодировке
Unicode
.
В кодировке
Unicode
все си
м
волы кодируются не 8
-
ми, а 16
-
ти битн
ыми кодами, что
расширяет таблицу кодов более чем до 65
тыс.
комбинаций и обеспечивает не только к
о-
дировку английских букв, но и символов национальных алф
а
витов, в том числе русского.
Преобразование в
Unicode
при запуске программы
выполняется автоматически
,
из
расчета
, что исходный текст представлен в кодировке
Windows
-
125
2
(
базовый
западное
в-
ропейский
вариант
8
-
ми битной кодировки
)
. Таким о
б
разом, для символов английского
алфавита, коды которых в обеих таблицах совпадают, преобразование проходит нормал
ь-
но,
а для символов русского
–
с и
с
кажением.
Согласно концепции
Qt
все надписи формы хранятся сразу в кодировке
Unicode
в
виде строк
–
объектов класса
QString
, поэтому с отображением этих надписей
на экране
проблем не возникает. Но преобразование
выводимых
стро
к в
Unicode
при
их
описании
следует выполнить программно.
Для работы с разными
,
в том числе национальными кодировками в
Qt
определено
семейство классов,
одним из
которых является класс
QTextCodec
. Объекты эт
ого
кла
с
с
а
обеспечивают необходимые перекодировки
и в том числе преобразование строк в
U
n
icode
в соответствии с используемой таблицей кодов.
Т
аблица
кодов русского языка 1251
может
быть
устан
овлена
при создании объекта класса
QTextCodec
:
QTextCodec *codec = QTextCodec::codecForName("Windows
-
1251");
П
роц
есс перекодировки в
Unicode
осуществляется посредством м
е
тода:
QString
QTextCodec
::toUnicode(char *str);
например
:
helloL
abel
=
new
QLabel
(
codec
-
toUnicode
("
Привет
!"),
this
);
Пример 1.
3
.
Приложение
Hello
. Создание русскоязычного интерфейса.
Создание интерф
ейса на русском языке по сравнению с программой примера 1.2 п
о-
требует незначительного изменения только файлов описания и реализации окна
. Файл
программы
main
.
cpp
при этом
останется без изменения
.
Файл
win
.
h
:
#ifndef
win_h
#define
win_h
#include
QtGu;i000;QtGui
cla
ss
Win:
public
{
private
:
QTextCodec *codec;
//
перекодировщик
QLabel *helloLabel;
QPushButton *exitButton;
public
:
};
#endif
Файл
win.cpp
:
#include
"win.h"
{
c
odec = QTextCodec::codecForName(
"Windows
-
1251"
);
-
toUnicode(
"
Приветствие
"
));
helloLabel =
new
QLabel(codec
-
toUnicode(
"
Привет
!"
),
this
);
exitButton =
new
QPushButton(codec
-
toUnicode(
"
Выход
"
),
this
);
QHBoxLayou
t *layout =
new
QHBoxLayout(
this
);
layout
-
layout
-
connect(exitButton,
SIGNAL
(clicked(
bool
)),
this
,
SLOT
(
close
()));
}
После запуска программы получаем на экране окно с текстом на р
усском языке (см.
рисунок 1.
5
).
Рисунок
1
.
5
–
Интерфейс на русском языке
Примечание
. Следует иметь в виду, что помимо
средств
создания национальных и
н-
терфейсов в
Qt
предусмотрены средства разработки
ин
терн
ационал
ьных
приложений
с
выбором языка интерфейса
. С этой целью
предлагаются специальные утилиты и
прил
о-
жение
для составления перев
о
дов
–
Qt
Linguist
[1]
.
1.2
Особенности компиляции
-
сборки программ, использующих библиотеку
Qt
При создании библиотеки
Qt
разраб
отчики несколько расширили возможн
ости ста
н-
дартного варианта языка
С++, добавив к стандартному набору операторов и макросов С++
специальные макросы, которые обеспечивают
передачу и обработку сигналов
,
хранение
информации о типе времени выполнения и динамич
ески
е
свойств
а объе
к
тов и т.п.
Реализацию механизмов библиотеки
Qt
, отсутствующих в С++,
обеспечивает
сп
е
ц
и-
ализированный препроцессор
Qt
–
-
object
Compiler
–
Мета
-
объектный компилятор
(
MOC
)
. Этот препроцессор
обрабатывает исходный текст программы, под
ставляя вместо
специальных макросов
Qt
реализацию заказанных свойств на С++ (см. рис
у
нок 1
.
6
).
Рисунок
1
.
6
–
Схема сборки приложения
при наличии в нем макросов
Qt
Как следует и
з схемы,
MOC
обрабатывает только заголовочные файлы, содержащие
описание классов, наследуемых от классов
Qt
.
В результате работы МОС в описание об
ъ-
являемых классов включаются вспомогательные методы классов
Qt
. Реализация этих м
е-
тодов помещается в файл
mo
с
_
Имя класса
.
cpp
, который подключается к проекту п
о-
средством
автоматически
добавляемого
#
include
.
Тексты основных методов в файле ре
а-
лизации класса при этом не затрагивае
т
ся.
После выполнения
MOC
на выходе получается исходный
текст программы на ©ч
и-
с
томª С+
+
.
Окончательная к
омпиляция и сборка программы
используемым
компилятором
C++ и компоновщиком, доступными в рамках платформы, где осуществляется
компил
я-
ция
-
сбо
р
ка
.
1.2.1
Сборка
приложений
в командном режиме
Разработка приложений
на многих платформах (таких как
L
inux
,
Solaris, HP
-
UX и
др.
)
часто
выполняе
тся без специализированных сред
непосредственно в командном р
е-
жиме
.
При этом текстовые модули программы создаются в
простейших
текстовых реда
к-
торах типа Блокнота, а компиляция, сборка и отладка программ осуществляе
тся
команд
а-
ми
вызов
а
соответствующих программ: компилятора, компоновщика и
(
при наличии
)
о
т-
ладчика.
С
таким
режимом работы целесообра
з
но познакомиться и в
Windows
.
Помимо
cpp
-
и
h
-
файл
ов
с текстом программы
для создания приложения необходим
файл
проект
а
, к
оторый должен содержать сведения о
компиляции и
сборк
е программы
.
О
пер
а
ции
по созданию файла проекта, а также его компиляции
-
сборки
в соответствии с
названием раздела
выполн
им
в к
о
мандном (консольном) режиме.
Для
работы в командном режиме
необходимо, чтобы
переменные окружения, указ
ы-
вающие местоположение
используемых пакетов
и тип компилятора, который будет и
с-
пользован при сборке Qt
-
проектов, были правильно определены.
В
Windows
д
ля правил
ь-
ного определения переменных
окружения
следует
войти в консольный реж
им через к
о-
манд
у
,
предусмотренную при установке
Qt
в меню
П
уск
оп
е
рационной системы
:
Пуск
\
…
\
Qt
by
Nokia
v
4.6.2 (
VS
2008
OpenSource
)
\
Qt
Command
Prompt
.
После этого, чтобы облегчить работу в консольном режиме целесообразно вызвать
файл
о
вый менеджер
Far
(или д
ругой, например
WinCommander
)
. П
ри этом понадобится
указать
полный путь к приложению
. Так
если
менеджер
F
ar
установлен в папке
Program
F
i
les
на диске
C
, то
к
о
манда должна выглядеть так
:
″
C
:
\
Program
Files
\
Far
\
Far
.
exe
″
К
авычки необходимы, поскол
ь
ку
имя кат
алога
Program
Files
состоит из двух слов.
Затем
следует
объявить
текущей ту
папку
, в которой наход
я
тся cpp
-
и
h
-
файл
ы
пр
о-
граммы
. Для этого
переходим в нее посредством
Far
или
вводим
команду изменения д
и-
ректории
cd <Имя_
каталога
.
Последовательность д
ействий по компиляции
-
сборке приложения выглядит сл
е
д
у-
ющим образом.
1.
Создание файла
-
проекта приложения
.
Для создания файла
-
проекта, включающ
е-
го файлы текущей
(!)
директории,
используют
специальн
ую
консольную программу
Qt
–
qmake
, которой в к
а
честве опции пе
редается параметр
-
project
:
qmake
-
project
Если имя папки, в которой находится программа,
Hello
, то в
результате
работы
qmake
в
текущей
папке
появится файл
проекта
Hello
.
pro
, со следующим содержимым:
TEMPLATE
=
app
# тип исполняемого файла
–
.
exe
TAR
=
# имя исполняемого файла
–
по умолчанию
DEPENDPATH
+= .
#
дополнительные пути разрешения ссылок
–
не заданы
INCLUDEPATH
+= .
#
дополнительные пути поиска файлов
–
не заданы
#
Input
#
комментарий
–
исходные
фай
лы
HEADERS += win.h
SOURCES += main.cpp win.cpp
Содержимое файла
-
проекта
определяет
параметры
процесса
компиляции
-
сборки и
с-
полняемого файла из
исходных
файлов проекта
и может включать переменные, перечи
с-
ленные в таблице 1.1
.
Таблица 1.1
–
Переменные файла
проекта
Переме
н
ная
Оглавление
TEMPLATE
Шаблон, используемый в проекте. Он определяет, что будет на выходе пр
о-
цесса сборки: приложение, библиотека или подкл
ю
чаемый модуль.
Имя результата сборки: приложения, библиотеки или модуля. По умо
л
чанию
совпа
дает с
именем каталога.
DESTDIR
Каталог, в который будет помещен исполняемый или бинарный файл
, пол
у-
ченный в результате сборки
. По умолчанию зависит от параметра
CONFIG
:
CONFIG
=
debug
–
результат помещается в
подкаталог
debug
текущего катал
о-
га,
CONFIG
=
rele
ase
–
результат помещается в
подкаталог
release
текущего к
а-
талога.
CONFIG
Общие параметры настройки проекта
, например
создать
отладочный
(
debug
)
или конечный
(
realease
)
вариант
ы
приложения.
По умолчанию создается отл
а-
дочный вариант приложения.
QT
Qt
-
орие
нтированные параметры конфигурации
, например указывающие на
и
с
пользование классов графического интерфейса пользователя (
Graphics
User
Inte
r
face
–
GUI
)
или
на использование средств
OpenGL
–
OPENGL
.
HEADERS
Список заголовочных файлов (.h), используемых при
сборке пр
о
екта.
SOURCES
Список файлов с исходным кодом
(
.
cpp
)
, которые используются при сборке
проекта.
FORMS
Список файлов
форм, полученных с использованием
Qt
Designer
(.
ui
)
.
RESOURCES
Список файлов ресурсов (.rc), которые включаются в конечный проект
(
пикт
о-
граммы, картинки и т.п.
)
.
DEF_FILE
Файл .def, который линкуется вместе с приложением (только для Windows).
RC_FILE
Файл ресурса для приложения (только для Windows).
В
простейших
случа
ях
автоматически полученный
файл
проекта
можно
использ
о-
вать
п
ри отладке приложения. Однако
если
при проектировании интерфейса
были
испол
ь-
зова
ны
макросы
Qt
, например
QOBJECT
, то
в файл проекта
н
е
обходимо
добавить
:
QT += gui
#
используемые средства
Qt
: графический интерфейс
Е
сли
же
необходимо создать
итогов
ый вариант реализации, файл проекта надо
от
р
е-
дактировать
так
:
TEMPLATE = app
# тип исполняемого файла
–
.
exe
Hello
# имя исполняемого файла
–
Hello
QT += gui
#
используемые
средства
Qt
: графический интерфейс
CONFIG
+= release
#
создание итогового варианта
реализации
#
Input
#
комментарий
–
исходные
файлы
HEADERS += win.h
SOURCES += main.cpp win.cpp
2.
Создание файла управления компиляцией
-
сборкой.
После создания
и
редактиров
а-
ния файла проекта
Hello
.pro
п
овторно вызываем процедуру
qmake
, передавая ей в кач
е-
с
т
ве параметра
имя
файл
а
проекта
:
qmake
Hello
.pro
Теперь
qmake
на базе файла
проекта
формирует файл
Makefile
, определяющий фа
к-
тический порядок
компиляции
-
сборки программы,
место
положение компилятора и
нео
б-
ходимых библиотек
.
Если все прошло нормально, то
в текущей директории появи
т
ся файл
Makefile
, два
подкаталога
debug
и
release
и несколько вспомогательных файлов
.
3.
Компиляция
-
сборка приложения.
Не меняя текущей
директории,
в
водим к
о
манду
вызова процеду
ры компиляции
-
сборки
make
:
nmake
–
если используется компилятор
-
компоновщик
Microsoft
Visual
C
++;
mingw32
-
make
–
для вызова компилятора
mingw
.
При этом в обоих случаях надо быть уверенным, что путь к папке
bin
, содержащей
используемую
программу
,
в системе
установлен. При необходимости путь можно доб
а-
вить к предусмотренным в системе
, например так
:
\
Program Files
\
Microsoft Visual Studio 9.0
\
VC
\
bin
;%
PATH
%
Результат сборки программы
–
приложение
Hel
lo
.exe
и промежуточные файлы пр
о-
цесса компиляции
/
сборки
, которые в зависимости от задания будут
добавлены
в каталог
debug
или
r
e
lease
.
4.
Выполнение программы.
Запускаем программу
Hello
.
exe
и на экране получаем о
к-
но приложения.
При щелчке мышкой по кнопке
Close
или Выход
приложение завершает
р
а
боту.
Примечание.
В процессе работы
приложению
Qt
необходимы
динамические библи
о-
теки QtCore4.dll и
QtGui
4.
dll
, которые должны
быть доступны
в путях автовызова, уст
а-
навливаемых системной переменной
P
ath
, или
могут
быт
ь скопированы в директорию
приложения
Hello
\
debug
.
1.2.2
С
борка
Qt
-
программ
в среде
Microsoft
Visual
Studio
В качестве альтернативы
компиляции
-
сборке
приложений
Qt
в командном режиме
можно предложить
создание
приложений с использованием среды
Microsoft
Visual
S
tudio
2008 и выше.
Для этого необходимо скачать и установить на компьютер специальны
й
д
и
стрибутив
–
би
б
лиотек
у
для
Visual
Studio
и плагин
для среды
(
см. приложение А
)
.
После установки плагина
Qt
в
Visual
Studio
при создании приложений становятся
доступны
ш
аблоны приложений
Qt
:
Qt
Application
,
Qt
4
Designer
Plugin
,
Qt
L
i
brary
и т.д.
Однако практика показывает, что
на начальном этапе обучения
создавать заготовку
проекта удобнее
в консольном режиме
Qt
(
см. раздел 1.2.1
). При этом
следует
созда
ть
к
а-
талог
будуще
го проекта (имя каталога
будет совпадать с
им
енем
проекта!)
и в
этот кат
а-
лог поме
стить
хотя бы
пустые
заготовки
будущих исходных файлов программы
с нужн
ы-
ми именами и расширени
я
ми.
Затем и
с
пользуя
команду
qmake
-
project
созда
ем
файл проекта
и
корректируем
его, как указано в разделе 1.2.1.
Далее возможны два варианта действий.
А. У
станавливаем
в проекте
TEMPLATE
=
vcapp
#
проект
Visu
a
l
Studio
и еще раз вызываем
qmake
:
qmake
<Имя файла проекта>
В результате на базе файла проекта
Qt
создается файл прое
кта
Visual
C
++
, при о
т-
крытии которого автоматически будет вызываться среда
Microsoft
Visual
C
++
с нужными
путями.
Б. Загружаем
Visual
Studio
2008
(или более позднюю версию) с установленным пл
а-
гином и открываем файл проекта, используя команду меню
Qt
\
Ope
n Qt Project File (.pro) …
Всю дальнейшую работу по созданию, компиляции, сборке и отладке
Qt
-
приложений можно выполнять в среде
Visual
Studio
.
Если плагин для
Visual
Studio
не установлен, то
для нормального подключения би
б-
лиотек
Qt
следует
вызывать
Visua
l
Studio
либо
через специальный консольный режим
,
как
было описано выше,
либо через команду м
е
ню Пуск
:
Пуск
\
…
\
Qt
by
Nokia
v
4.6.2 (
VS
2008
OpenSource
)
\
Visual Studio with Qt 4.6.2 .
1.2.3
Qt
Designer
. Быстрая разработка протот
и
пов
интерфейсов
Qt
Designer
–
программа визуального проектирования интерфейса пользователя.
Р
е-
зультатом работы этой программы явля
е
тся файл
XML
-
описани
я
форм
ы
, имеющи
й
ра
с-
ширение
.
ui
–
Имя формы
.
ui
(см. рисунок 1.
7
)
.
Рисунок
1
.
7
–
Схема
компиляции
-
сборки приложения с формами интерфейса, созданными в
Qt
D
e
signer
Файлы, созданные
Qt
Designer
в дальнейшем дополнительно обрабатываются спец
и-
альным компилятором
UIC
(
User
Interface
Comp
iler
–
Компилятор пользовательского и
н-
терфейса
)
, который
формирует
код программы на С++ из его
XML
-
описани
я
. Результ
а
том
компиляции является файл
ui
_
Имя формы
.
h
. Этот файл
содерж
ит
описание метода
se
t-
upUi
,
использующего классы
Qt
и обеспечивающего создан
ие разработанной формы
.
Автоматически созданный файл вместе с описанием класса формы передаются
MOC
для реализации
необходимых
дополнительных
функций
библиотеки
Qt
.
После этого файлы приложения обрабатываются компилятором и компоновщиком
С++. В результат
е
–
создается файл приложения.
Помимо конструирования внешнего вида окна пр
и
ложения
Qt
Designer
позволяет:
запрограммировать предусмотренные
Qt
(!) аспекты поведения формы и ее ко
м-
понентов;
связать метки (объекты класса
QLabel
)
с другими виджетами так, ч
то при щелчке
мышкой на метке фокус ввода будет передаваться на ассоциированный виджет;
определить порядок передачи фокуса ввода виджетам формы при нажатии кл
а-
виши
Tab
.
Примечание
. Следует подчеркнуть, что описать поведение виджетов можно лишь в тех сл
у-
ча
ях, когда в приложении задействованы предусмотренные в классах виджетов сообщения сигн
а-
лы и реакции на них
–
слоты. Новые сигналы и слоты можно объявлять при создании п
о
томков
классов виджетов специальными операторами
Qt
(см. раздел 2.3).
Описание всех пе
речисленных связей виджетов
–
также на языке
XML
–
добавляется
в файл формы с расширением
.
ui
.
Исполняемый
файл
Qt
Designer
designer
.
exe
может быть запущен как из консольного
окна, так и непосредственно из
Windows
.
При запуске на экране появляется главно
е окно приложения и перед ним диалоговое
окно
New
Form
(см. рисунок
1.
8).
Рисунок
1
.
8
–
Вид конструктора форм при запуске программы
В диалоговом окне предлагается выбрать шаблон для формы окна. В качестве
таких
шаблонов могут использоваться объекты классов
QWidget
,
QDialog
и
QMainWindow
.
З
а-
тем, уже в
Designer
выполняют проектирование интерфейса.
Выполним визуальное проектирование формы интерфейса приложения
Hello
, ра
с-
смотренн
о
го в
разделе
1.
1
.
Пример 1.
4
.
П
риложение
Hello
.
С
оздание
с использованием
программы
визуального
проектирования формы.
Создание
главного окна приложения
.
В качестве основы формы будем использовать
объект класса
, как в предыдущем примере
.
Соответственно
в ответ на запрос
D
e-
signer
выбираем шаблон (
templates
)
Widget
и нажимаем кнопку
Create
.
В результате созд
а-
ется заготовка окна
, озаглавленная
Form
–
untitled
, где
Form
–
имя объекта класса
по умолчанию,
untitled
(безымянный)
–
означает, что файл создаваемой формы прилож
е-
ния п
ока не имеет имени.
На эту форму с левой панели
Widget
box
п
е
ретаскиваем мышкой два виджета
Label
и
PushButton
(
см. рисунок 1.
9
)
.
Рисунок
1
.
9
–
Основные панели дизайнера и добавление виджетов на форму
По
лученную форму сохраняем под именем
form
.
ui
. Для этого используется пункт
меню
File
\
Save
as
…
Далее, используя
панели Инспектора объектов
(
Object
Inspector
)
и Редактора свойств
(
Property
Editor
)
,
выбираем объекты и присваиваем им новые имена, меняя свойств
о
o
b-
jectName
:
QWidget
:
objectName
=
Form
o
b
jectName
= win;
QPushButton
:
objectName
=
pushButton
objectName
=
button.
Также с помощью Редактора свойств меняем заголовки виджетов (свойство
text
)
:
label
:
text =
ʺ
Hello!
ʺ
; button
:
text =
ʺ
Close
ʺ
.
Управление расположением и размерами виджетов.
Также как и при создании и
н-
терфейса вручную для управления размещением виджетов на форме
Qt
Designer
испол
ь-
зует компоновщики.
Для добавления компоновщика к
омпонуемые виджеты должны быть
выделе
ны
, что можно сделать
,
щелкая
мышкой по виджетам при нажатой клавиши
Ctrl
.
Добавление компоновщиков и с
вязывание
с ними
виджетов осуществляется выб
о-
ром пунктов м
е
ню
:
Form
\
Lay
o
ut
Horizontally
–
компоновать
по
горизонтали
,
Form
\
Lay
o
ut
Vertically
–
компонова
ть
по
вертикали
,
Form
\
Lay
o
ut
in a Grid
–
компоновать
по
сетке
,
или нажатием соответствующих кнопок на панели компонентов дизайнера.
Обратите внимание, что с
вязывание
главного
компоновщика с окном происходит
,
если выбрать горизонтальную или вертикальную ком
поновку
при отсутствии выделенных
видж
е
тов.
Компоновку окна приложения выполняем следующим образом:
label
и
button
–
компонуем
по вертикали;
окно приложения
(при отсутствии выбранных виджетов)
–
компонуем
по гор
и-
зонтали.
После настройки виджетов и выполнен
ия компоновки получаем
готовую форму
(р
и-
сунок 1.
10
)
,
окончательный вариант
котор
ой
не забываем сохранить
, используя пункт м
е-
ню
File
/
Save
.
Рисунок
1
.
10
–
Вид окна дизайнера после компоновки формы
Связывани
е сигналов и слотов.
Как уже говорилось выше
, кроме визуального ко
н-
с
т
руирование вида окон,
Qt
Designer
позволяет связать заранее предусмотренные сигналы
виджетов с
такой же заранее предусмотренной
реакцией других виджетов на эти сигналы.
Для этого необходи
мо переключиться в режим
Сигналы и слоты
,
выбрав пункт меню
E
d-
it
\
Edit
Si
g
nals
/
Slots
.
Указание виджетов, между
сигналом и слотом
которы
х
устанавливается связь,
в
ы-
полняется визуально: щелк
аем
левой клавишей мышки по виджету кнопки
и
, не отпу
с
кая
левой клавиш
и
,
переносим указатель мышки на
свободное место
окна
(
см. рисунок 1.
1
1
)
.
Выбранные виджеты связываются
красной
линией, после чего открывается окно
Configure
Co
n
nection
, в котором выбира
ем
слева сигнал
clicked
()
, а справа слот
close
()
. (
Для
того, чтобы спра
ва появились доступные слоты необходимо внизу
окна
выбрать
Show
Signals
and
Slots
inherited
from
QWidget
–
Показать сигналы и слоты, наследованные от
QWidget
).
Для завершения опер
а
ции необходимо нажать на кнопку
OK
.
Рисунок
1
.
11
–
Вид окна при связывании сигнала от кнопки с закрытием окна
После закрытия вспомогательного окна установленные связи
на форме маркируются
выбранными сигналом и слотом (см. рисунок
1.
1
2
).
Рисунок
1
.
12
–
Маркировка связей ©Сигнал
–
слотª в дизайнере
Предварительный просмотр формы.
Qt
Designer
позволяет просмотреть получе
н-
ную форму. Для этого необходимо выбрать пункт меню
Form
\
Preview
. В режиме предв
а-
рительного просмотра форма выгляди
т и реагирует на действия пользователя так, как это
будет происходить во время работы программы
(см. р
и
сунок
1.
1
3
)
.
Рисунок
1
.
13
–
Предварительный просмотр сконструированной формы
Полученную и проверенную
форму сохраняем еще раз и переходим к созданию
со
б-
ственно
приложения.
Описание класса окна
.
Приложение
в соответствии со схемой
работы
Qt
Designer
должно включать класс окна. Этот класс
может
строиться двумя способами:
1) как
насл
е
д
уе
мый
от двух классов:
класса, на базе объекта которого строится окно приложения,
класса,
описание которого получается автоматически при обработке созданного
Qt
Designer
файла формы компилятором
UIC
;
2) как композиция или агрегация тех же классов.
Во втором случае объект клас
са, наследуемого от класса
Qt
, включает поле автом
а-
тически созданного класса
или содержит указатель на него
(см. рисунок 1.1
4
).
Рисунок
1
.
14
–
Возможные варианты подключения ав
томатически созданного класса образа окна:
а
–
множественное наследование;
б
–
композиция;
в
–
наполнение (агрегация)
Вариант множественного наследования удобнее при написании программы, п
о-
скольку при обращении к полям и методам
родительского класса
не тре
буется дополн
и-
тельно указывать имя поля
(обычного
или указателя
)
, поэтому желательно использовать
именно его.
При использовании множественного наследования о
писание класса
окна нашего
приложения
должно выглядеть так:
#
ifndef
w
in
_
H
#
define
w
in
_
H
#
include
Q
#
include
"
ui
_
form
.
h
"
//
заголовок
сгенерированный
UIC
public Ui::win
{
Q_OBJECT
public:
};
#endif
Класс
win
–
класс
, автоматически
созданный при работе
Qt
Designer
и описанный
в
файле
u
i
_
form
.
h
,
Ui
–
имя адресного пространства, объявленного
Qt
Designer
.
О
дним
из методов этого класса является метод
, который обеспечивает изображение и
заданную ре
акцию формы. Конструктор
класса
окна
, опис
ываем
ый в файле реализации
Win
.
cpp
,
должен
вы
зыват
ь
этот метод для построения о
к
на:
QtGu;i000;#include QtGui
Win.;h000;#include Win.h
{
;
// конструирование формы
};
После этого о
сновной программе остается только создать объект
-
приложение
и
об
ъ-
ект
-
окно, виз
уализировать форму и ее виджеты и запустить цикл обработки сообщ
е
ний:
QApp;lica;tion;#include QApplication
#include "win.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Win * win= new Win();
win
-
show();
app
.
exec
();
//
запуск
цикла
обработки
сообщ
е
ний
}
Компиляция
-
сборка программы в этом случае
может
осуществлят
ь
ся
в командном
режиме
, как указано в разделе 1.
3
, или с помощью среды
Microsoft
Visual
Studio
, как пре
д-
лагается в разд
е
ле 1.
4
.
Интересно посмотреть
автоматически созданное оп
исание
класса
окна в
файле
ui
_
form
.
h
:
#
ifndef
UI
_
FORM
_
H
// защита от повторной компиляции
#
define
UI
_
FORM
_
H
#
include
QtCore
/
QVariant
//
подключение
заголовков
файлов
Qt
QtGu;i/QA;tio;n000;#include QtGui/QAction
QtGu;i/QA;ppli;Êti;on00;#include QtGui/QApplication
#include QtGui/QButtonGrou
p
QtGu;i/QH;oxL; you;t000;#include QtGui/QHBoxLayout
QtGu;i/QH;rVie;w000;#include QtGui/QHeaderView
QtGu;i/QL;ાl;#include QtGui/QLabel
QtGu;i/QP;ushB;utto;n000;#include QtGui/QPushButton
QtGu;i/QV;oxL; you;t000;#include QtGui/QVBoxLayout
QT
_
BEGIN
_
NAMESPACE
//
метка
начала
пространства
имен
class
Ui
_
win
// описание
базового класса
для
класса
окна
{
public
:
QHBoxLayout
*
horizontalLayout
;
//
горизонтальный
компоновщик
QVBoxLayout
*
verticalLayout
;
//
вертикальный
компоновщик
QLabel *label;
//
метка
QPushButton *pushButto
n;
//
кнопка
//
метод
конструирования
формы
{
if (win
-
objectName().isEmpty())
win
-
win
-
resize(254, 96);
horizontalLayout = new QHBoxL
ayout(win);
horizontalLayout
-
fr
o
mUtf8("horizontalLayout"));
verticalLayout = new QVBoxLayout();
verticalLayout
-
fromUtf8(
"verticalLayout"));
label = new QLabel(win);
label
-
verticalLayout
-
pushButton = new QPushButton(win);
pushButton
-
fromUtf8("pushButton"));
verticalLayout
-
horizontalLayout
-
addLayout(verticalLayout);
QObject::connect(pushButton, SIGNAL(clicked()),
win
, SLOT(close()));
{
win
-
"Form", 0, QApplication::UnicodeUTF8));
label
-
"He
l
lo!", 0, QApplication::UnicodeUTF8));
pushButton
-
"Close", 0, QApplication::UnicodeUTF8));
};
namesp
ace Ui {
class win: public Ui_win {};
}
QT
_
END
_
NAMESPACE
// метка конца пространства имен
Ui
#
endif
Qt
Designer
автоматически построил текст, близкий к
тексту
программ
ы
из раздела
1.
1
. Однако этот текст существенно длиннее и более сложно организован, что вызвано
н
е
обходимостью предусмотреть в шаблоне
различные
вариант
ы
.
Так, например,
для
орг
а-
н
и
зации смены языка интерфейса в процессе работы программы
все строки, которые
дол
ж
ны быть переведены
,
собраны в одном специальном методе
ranslateUi
()
.
Избыточность кода, генерируемого
Qt
Designer
, является причиной тог
о, что данный
пакет
обычно
использ
уют
для быстрого создания прототипа интерфейса, а
для коне
ч
ной
реализации
интерфейс
ы
созда
ют
вручную
с использованием кла
с
сов
Qt
.
1.2.4
Интегрированная среда разработки
Qt
Creator
Интегрированная среда
Qt
Creator
обеспечивает
в
есь процесс
созда
ния
и отла
дки
приложени
й
в
операционных систем
ах
Linux, Mac OS X и Windows.
Среда включает собственный специализированный редактор.
В отличие от обычного
текстового редактора текстовый редактор
Qt
Creator
предназначен для работы с исходн
ы-
ми текстами программ,
поэтому
он
:
помогает форматировать код
программы;
обеспечивает режим подсказок
при вводе кода
;
выполняет контроль ошибок;
осуществляет навигацию по коду
по классам, функциям и симв
о
лам
;
предоставляет
контекстно
-
зависимую справку по кл
ассам, функциям и симв
о
лам
;
при переименовании учитывает области действия идентификаторов;
идентифицирует
место в коде
,
где функция была описана или вызв
а
на
.
Конструирование форм в
среде
можно выполнять вручную и
ли
с использованием
клона
программы
Qt
Desig
ner
. Компиляция
-
сборка выполняется с помощью
С++
MinGW
или
Visual
C
++
в зависимости от настоек среды
.
Рассмотрим процесс проектирования приложений с использованием
Qt
Creator
.
При запуске среды
Qt
Creator
на экране появляется окно Начало работы (см. рисуно
к
1.1
5
)
, которое содержит ссылки на учебники и примеры.
Рисунок
1
.
15
–
Вид окна Начало работы
среды
Qt
Creator
Переключение режимов работы среды осуществляется с использованием левой п
а-
нели
окна
, на которо
й
статически расположены кнопки:
Начало
–
переключает среду в режим Начало работы, используемый для вызова
примеров или создания новых проектов;
Редактор
–
организует переключение в просмотр и редактирование исходных те
к-
стов программы;
Дизайн
–
вызывает Д
изайнер для создания
/
редактирования форм проекта;
Отладка
–
используется при пошаговом проходе программы и при работе с то
ч-
ками останова;
Проекты
–
предназнач
ается
для работы с несколькими проектами одновременно;
Справка
–
организует работу со справочными
сведения
ми
, обеспечивая ко
н-
текс
т
ный и обычный поиски информации.
При использовании
Qt
Creator
приложение создается аналогично тому, как это дел
а-
ется в других средах, например в
Delphi
:
разрабатываются формы окон (в
Qt
Designer
или
непосредственно в коде п
р
о-
граммы
);
выполняется описание классов этих окон
(автоматически или вручную)
;
описываются методы классов окон и основная программа;
выполняется тестирование и отладка полученной программы.
Примечание
.
При создании приложения с использованием
Qt
Designer
с
реда
Qt
Creator
с
о-
з
дает
не только файл формы с расширением .
ui
, но и заготовку заголовка класса окна. При этом
класс, автоматически
описанный
дизайнером
,
может
, не только служить б
а
зовым для класса окна
вместе с
, но и находиться с этим классом в от
ношениях композиции и наполнения
, как
указывалось ранее.
Несмотря на более простой вариант с множественным наследованием, среда по
умолчанию предлагает вариант композиции класса окна и автоматически созданного
класса.
Для
пере
настройки выбираем пункт мен
ю Инструменты
\
Параметры
\
Дизайнер… и
устанавливаем Множественное наследование (см. р
и
сунок 1.1
6
)
.
Рисунок
1
.
16
–
Настройка отношения автоматически созданного и оконного классов
Пример 1.
5
.
Приложение
Hello
.
Р
азработка с использованием
Qt
Creator
.
Создание нового проекта.
Разработка
приложения начинается, как и в других ср
е-
дах, с создания нового проекта
. Проект создается при выборе пункта
меню
Файл
\
Новый
файл или проект
или при нажатии на кнопку
Создать проек
т
окна Начало работы
(см.
р
и
с
у
нок 1.1
4
)
.
При
заказе создания проекта
на экране
появля
ю
тся окн
а
мастера создания проекта
,
на которых
последовательно
предлагается выбрать шаблон, местоположение, назва
ние
,
баз
о
вый класс окна
, названия заголовочного файла и ф
айла реализации класса
и указать,
предполагается ли использование
Qt
Designer
для создани
я
класса описания
форм
ы
и
н-
терфейса
, и, е
с
ли да, то его имя
.
В соответствии с заданием мы выбираем шаблон
GUI
(
Graphic
User
Interface
–
Гр
а-
фический интерфейс пользоват
еля
)
приложение
Qt
(
см. рисунок 1.1
7
)
,
заказываем созд
а-
ние окна с применением
Qt
Designer
и подтверждаем все автоматически сгенерированные
имена
.
Рисунок
1
.
17
–
Первое из последовательности окон задания ха
рактеристик проекта
В результате получаем
заготовк
у
проект
а
, которая
включает следующие исходные
файлы:
Hello
.pro
–
файл проекта;
main
.
cpp
–
файл основной программы;
widget
.
h
–
заголовочный файл класса окна (заготовка этого файла создается авт
о-
матически);
widget
.
cpp
–
файл реализации класса окна;
widget
.
ui
–
редактируемый в
Qt
Designer
файл описания класса образа окна.
Аналогично другим средам разработки заготовку можно запускать на выполнение.
При этом на экране появится пустое окно с обычным набором кнопо
к (см. рисунок 1.1
8
)
.
Файл проекта заготовки уже настроен для работы со всеми файлами проекта:
QT += core gui
TEMPLATE = app
SOURCES += main.cpp
\
Рисунок
1
.
18
–
Окно заготовки приложения
Файл
заголовка окна
.
h
содержит минимальное описание класса окна,
н
а
следуемого от двух классов
QWidget
и
автоматически созданного дизайнером класса
о
б
раза окна
Widget
:
#d
{
Q_OBJECT
public:
};
#
endif
//
_
H
Файл реализации класса
widget
.
cpp
содержит только вызов метода построения о
б
р
а-
за ок
на:
{
(
this
);
// построение образа окна
}
О
сновная программа
main
.
cpp
в заготовке
создает объект
-
приложение
a
и окно
w
,
визуализирует окно и запускает цикл обработки сообщений:
QtGu;i/QA;ppli;Êti;on00;#include QtGui/QApplication
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
w.show();
}
Создание
образа
окна
.
Создание образа окна выполняется с использованием
Qt
D
e-
signer
.
Дл
я его вызова нажимаем слева кнопку Дизайн или дважды щелкаем мышкой по
файлу
widget
.
ui
в навигаторе.
Внешний вид дизайнера несколько отличается от того, который был рассмотрен в
разделе 1.4, однако отличия в основном косметические (см. рисунок 1.1
9
).
Рис
унок
1
.
19
–
Внешний вид окна дизайнера в среде
Qt
Creator
Процесс с
оздани
я
внешнего вида формы ничем от рассмотренного в разделе 1.
2.3
не
отличается.
Аналогично перетаскиваем с левой панели метку
QLabel
и кн
опку
QPushBu
t-
ton
, затем настраиваем их параметры
(
имена
label
и
button
, надписи
Hello
!
и
Close
соотве
т-
ственно
)
. Также
устанавливаем необходимые компоновщики.
Основное отличие
–
в переключении режимов: виджеты, действия, сигналы и слоты
и табуляция. Режим
виджетов и корректировки порядка переключения по
Tab
доступны
постоя
н
но, переключение между редакторами сигналов и слотов и действий происходит
при в
ы
боре закладок внизу в центр
альной части окна
.
Для нашего
функционирования нашего
приложения необходимо доб
авить один си
г-
нал и реакцию на него (связать сигнал с соответствующим слото
м
). Для этого переключ
а-
емся
на вкладку
редактор
а
сигналов и слотов и нажимаем кнопку ©
+
ª
над окном редакт
о-
ра
связей
. В окне поя
в
ляется новая строка:
О
тправитель
С
игнал
П
олучател
ь
С
лот
.
Если дважды щелкать мышкой по этим клеткам,
т
о будут открываться выпадающие
списки возможных вариантов. Выбираем нужные
элементы
и получ
а
ем:
button
clicked
()
close
()
.
П
ри запуске программы
на экране появляется
главное окно приложения (см.
рисунок
1.
20
), которое работает с соответствии с заданием.
Рисунок
1
.
20
–
Вид приложения, созданного в
среде
Qt
Creator
1.3
Информационная поддержка библиотеки
Qt
Assistant
Разработка программ с использование
м средств
Qt
существенно облегчается налич
и-
ем в системе справочной системы
по всем средствам, механизмам и классам
Qt
. Справо
ч-
ная система существует в виде отдельного приложения
Qt
Assistant
(файл
Assistant
.
exe
)
,
которое
та
к
же интегрирован
о
в среду програм
мирования
Qt
Creator
.
При вызове приложения
Qt
Assistant
на экране появляется главное окно справочной
системы (см. рисунок 1.
2
1
).
Рисунок
1
.
21
–
Вид главного окна справочной системы
Qt
Справочная система
предоставляет возможность навигации по разделам, по индек
с-
ному указателю, а также поиск классов и/или методов по именам, по контексту во всех
статьях документации. Документация предоставляет несколько вариантов группировки
классов и функций библиотеки, что
позволяет быстро найти классы для работы, например
с сигналами и слотами, с графикой, классы контейн
е
ры и пр.
Описание
Qt
содержит большое количество примеров. Частично документация пер
е-
ведена на русский язык. Русскоязычный вариант справочной системы можн
о взять на са
й-
те
http://doc.crossplatform.ru/qt/
и добавить в справочную систему
согла
с
но
инструкции
разработчиков
.
ГЛАВА 2
СРЕДСТВА
БИБЛИ
О
ТЕКИ
QT
Средства поддержки
библиотеки
классов
Qt добавля
ю
т к C++:
возможно
сть описания
свойств объектов
для работы в
Qt
Creator
;
механизм
непосредственного
взаимодействия объектов, называемый
сигналы и
слоты
;
мощные
события и фильтры событий
;
контекстный
перевод строк для интернационализации
;
защищенные указатели
QPointer
, автоматически устанавливаемые в 0 при ун
и-
ч
тожении объекта, на который они ссылаются
;
динамическое приведение
(d
ynamic cast), которое работает через границы библи
о-
тек
;
управляемые интервалами
таймеры
, которые делают возможным элегантную и
н-
теграцию многих задач в графический интерфейс пользователя, управля
е
мый событиями
.
Рассмотрим некоторые из указанные средств боле
е подробно.
2.1
В
иджеты
и
их свойства
Как уже упоминалось ранее
,
в
се
управляющие
интерфейсные элементы, такие как
кнопки, метки, текстовые редакторы и т.п.,
в
Qt
назван
ы
виджет
ами
.
Виджеты
–
объект
ы
интерфейсных классов, наследуемых от базового
интерфейсного
к
ласса
QWi
d
get
.
Этот
класс
в свою очередь наследуется от базового класса большинства классов
Qt
–
класса
QObject
, обеспечивающего работоспособность главных механизмов
Qt
.
Объектам класса
QWidget
соответствует
графическое
представление
–
прямоугол
ь-
ный фрагм
ент экрана
–
окно
.
Остальные в
иджет
ы
, как о
бъект
ы
класс
ов
, наследуем
ых
от
QWidget
,
также
представля
ю
т собой некотор
ые
, соответствующим образом оформленн
ые
прямоугольн
и
ки
.
QWidget
–
контейнерный класс, объекты которого
–
контейнеры или ©родителиª
по
термино
логии
Qt
отвечают
,
как за отображение управляемых виджетов
–
©детейª, так и за
о
с
вобождение выделенной
последним
памяти.
Примечание
. В теории объектно
-
ориентированного программирования термины ©родитель
–
ребенокª обычно используют для описания отношения
базов
ого
и произво
д
ных классов.
Однако
и
спользование в
Qt
этих терминов для обозначения объектов
-
контейнеров и управляемых видж
е-
тов особой путаницы не вносит, если обращать внимание на то, между какими компонентами фи
к-
сируется отношение: если речь идет об
отн
о
шении классов, то имеется в виду наследование, если
об отношении объектов
–
то отношение ©ко
н
тейнер
–
управляемый элементª.
При создании большинства виджетов используется конструктор
базового
класса
QWidget
с двумя параметрами:
nt=0, Qt::WindowFlags=0) {
…
}
Первый параметр
–
родитель. С помощью этого параметра строятся иерархии
объе
к-
тов
-
виджетов. Если в качестве первого параметра указан 0, то родителя у виджета нет
.
При отсутствии менеджеров компоновки т
акой виджет
отображается в
отдельном окне
и сам отвечает за выделение и о
с
вобождение памяти.
Второй параметр
–
флаги
–
битовая
комбинация,
отвеча
ющая
за тип
окна: обычное,
диалоговое, контекстное меню, панель инструментов, выпадающая подсказка и т.п. В пр
о-
стых приложениях этот парам
етр обычно берется по умолчанию
–
обычное окно
.
Е
сли при создании метки указать
объект класса
QWidget
в качестве родителя
,
window
(0);
//
окно
–
родительский виджет
QLabel
*
label
=
new
QLabel
("
Label
",
window
);
//
виджет
-
ребенок
то метка буде
т создана в рабочей области окна, будет становиться видимой или невид
и-
мой вместе с виджетом
win
и б
у
дет уничтожена вместе с ним
.
Контейнерные свойства класса
QWidget
наследуют
все
классы
-
потомки. Соотве
т-
с
т
венно любой виджет может служить контейнером для др
угих виджетов.
Использование контейнерных свойств виджетов существенно упрощает работу с
ними, позволяя
при создании
объединять виджеты формы в
динамическую
древ
о
видную
структуру
требуемой конфигурации
.
К
ор
невой виджет
формы
объявляют без
родителя
. Он
со
ответствует окну прилож
е-
ния.
Для корректного
выделения
/
освобождения памяти
виджетов
-
детей
при
созд
а-
нии
/
уничтожении корневого виджета, подчиненные виджеты
-
комп
о
ненты
размещают
в
динамической
памяти
.
Выделение памяти под них обычно осущ
е
ствля
ют
в конструкто
ре
класса родителя,
а освобождение
–
пропис
ано
в деструкторе
класса
QWidget
.
В качестве
корневых виджетов
для интерфейсных элементов обычно используются
объекты классов
QWidget
,
QDialog
и
Q
MainWidget
.
Объекты класса
QWidget
применяют
для создания простых ф
орм, объекты класса
QDialog
–
для конструирования диалоговых
окон
, а
объекты класса
Q
MainWidget
–
для построения сравнительно сложных окон пр
и-
ложений, включающих строку меню и панели инструме
н
тов.
Каждый виджет
может настраиваться
в среде
Qt
Creator
или вр
учную
посредством
изменения
его
свойств
.
С помощью свойств можно указать размеры виджетов, их расп
о-
ложение, особенности внешнего вида и др. Так же, как в
Delphi
, свойства ви
д
жетов в
Qt
Creator
доступны через окно Инспектора объектов, но их
можно изменять
и
во время р
а-
боты программы
.
В качестве примера рассмотрим следующие свойства:
bool
visible
–
видимость виджета и, соответственно, всех его подчиненных
виджетов; проверка свойства реализуется функцией
bool
isVisible
()
;
а
изменение
–
процедурой
void
ble
(
bool
vi
s
ible
)
;
bool
enabled
–
способность
принимать
и
обрабатывать
сообщения от клави
а-
туры и мыши
:
true
–
способно,
false
–
нет
;
проверка свойства реализуется функцией
bool
isEnabled
()
;
а изменение
–
процедурой
void
(
bool
enabled
)
;
Qt::Window
Modality
windowModality
–
тип
окна
:
Qt
::
nonModal
(
обычное
),
Qt
::
WindowModal
(
модальное
)
;
проверка свойства реализуется функцией
Qt::WindowModality windowModality
()
;
а изменение
–
процедурой
void
( Qt::WindowModality
windowModality)
;
QRec
t
–
размеры и положение виджета относительно родительского
окна; размеры
задаются прямоугольником
типа
QRect
с фиксированным верхним левым
углом (свойства
X
,
Y
), а также шириной и высотой (свойства
width
,
height
); при изм
е-
нении размера формы размеры
виджетов могут регулироваться
компоновщиком
в инте
р-
вале от заданных минимального
minimumSize()
до
максимальн
ого
maximumSize()
;
получение значения
осуществляют с помощью
функци
и
QRect
&
()
, измен
е-
ние зн
а
чений процедур
ами
void
(
int
x
,
int
y
,
int
w
,
int
h
)
или
void
Geometry
(
QRect
&)
;
QFont
font
–
шрифт, которым выполняются надписи в окне
;
QString
objectName
–
имя объекта (переменной) в программе, устанавлив
а-
ется процедурой
void
()
, читается функцией
objectName
()
и и
с-
пользуетс
я
для задания имени переменной в
Qt
Creator
и
при о
т
ладке программ
.
Всего д
ля объектов к
ласс
а
QWidget
определено более 50 свойств
и методов
(см. та
б-
лицу 2.1)
.
Таблица
2
.
1
–
Классификация с
войств и метод
ов
к
ласса
Группа
Свойства и
основные
методы
Общие
м
ет
о
ды
show
()
–
показать
,
hide
()
–
скрыть
,
raise
()
–
сделать первым в контейнере
,
lower
()
–
сделать
последним
в контейнере
,
close
()
–
закрыть
.
Управл
е
ние
окнами
windowMod
i
fied
–
признак изменения окна
,
windowTitle
–
загол
о
вок
окна
,
windowIcon
–
пиктограмма окна
,
windowIconText
,
isActiv
e-
Window
–
признак
активности окна
,
activateWindow
()
–
актив
из
ация
о
к
на
,
minimized
–
признак
свернутого состояния
,
showMinimized
()
–
свертывание окна
,
maximized
–
признак
ра
звернут
о-
го состояния
,
showMaximized
()
–
раз
вертывание окна
,
fullScreen
,
showFullScreen
(),
showNormal
().
Управл
е
ние
содерж
и
мым
update
()
-
обновить
,
repaint
()
-
пере
рисовать
,
scroll
()
–
изм
е-
нить размер рабочей области
.
Управление
положением
и
размерами
виджета
(геометрия)
pos
–
положение
левой
верхней
точки
,
x
(),
y
(),
rect
–
полож
е
ние
левой верхней точки и размеры виджета
,
size
,
width
(),
height
(),
move
()
–
перемещение виджета
,
resize
()
–
изменение размеров виджета
,
sizePolicy
,
sizeHint
(),
minimumSizeHint
(),
updateGe
o
(),
layout
(),
,
,
childrenRect
,
c
hildrenRegion
,
adjustSize
(),
mapFromGlobal
(),
mapToGlobal
(),
mapFromParent
(),
mapToParent
(),
maximumSize
,
minimumSize
,
sizeIncr
e-
ment
,
base
S
ize
,
()
.
Тип
vi
sible
,
(),
enabled
,
isEnabledTo
(),
modal
,
isWindow
(),
,
updatesEnabled
,
v
i
sibleRegion
().
Внешний вид
style
(),
(),
,
cursor
,
font
,
,
backgroundRole
(),
(),
fo
n
tInfo
(),
().
Взаимоде
й-
ствие с кл
а-
виатурой
focus
,
focusPolicy
,
(),
clearFocus
(),
(),
(),
focusNextChild
(),
f
o
cusPreviousChild
().
Захват мыши
и клавиатуры
grabMouse
(),
releaseMouse
(),
grabKeyboard
(),
releaseKeyboard
(),
mouseGrabber
(),
keyboardGrabber
().
Обработчики
событий
event
(),
mousePressEvent
(),
mouseReleaseEvent
(),
mouseDoubleClickEvent
(),
mouseMoveEvent
(),
keyPressEvent
(),
keyRelease
E
vent
(),
focusInEvent
(),
focusOutEvent
(),
wheelEvent
(),
enterEvent
(),
leave
E
vent
(),
paintEvent
(),
m
oveEvent
(),
resizeEvent
(),
closeEvent
(),
dragEnterEvent
(),
dragMoveEvent
(),
dragLeaveEvent
(),
dropEvent
(),
childEvent
(),
showEvent
(),
hideEvent
(),
custom
E
vent
()
,
changeEvent
()
.
Управлен
ие
контейнером
(),
window
(),
(),
winId
(),
find
(),
().
Помощь
(),
()
.
Пример 2.1.
Управление
размером
окна
посредством изменения
геометрических
свойств
корневого виджета
.
QtGu;i000;#include QtGui
int main(int
argc, char *argv[])
{
QApplication
app
(
argc
,
argv
);
// создаем объект
-
приложение
window
;
// создаем корневой виджет
QRect
rect
=
window
.
();
// читаем размер окна по умолчанию
window
.
(20,20,100,100);
//
устанавливаем размер окна
window
.
resize
(300,100);
// меняем ширину и высоту окна
//
устанавливаем
заголовок
//
сохраняем
имя
объекта
window.show();
//
визуализируем
окно
//
запускаем
цикл
обработки
сообщений
}
2.2
Управление расположением виджетов в окне
При создании окна приложения на базе любого
из перечисленных выше классов
-
ок
о
н
возникает проблема управления распо
ложением окон виджетов в окне пр
и
ложения.
Qt
предусматривает два способа решения этой проблемы:
задание координат каждого виджета вручную
, например посредством метода
()
;
использование специальных невидимых
пользователю
менеджеров
компоновки.
В
первом варианте при изменении размеров окна приложения пересчет геометрич
е-
ских параметров виджетов должен выполняться вручную.
Пример 2.
2
.
Р
азмещение виджетов
-
редакторов
в окне вручную
.
QtGu;i000;#include QtGui
int main(int argc, char *argv[])
{
QApplication
app(argc, argv);
Q
LineEdit
*
edit
1=new Q
LineEdit
("
Edit
1",&window);
Q
LineEdit
*
edit
2=new Q
LineEdit
("
Edit
2",&window);
edit
1
-
);
edit
2
-
window.show();
}
В результате на экране появляется окно, содержащее об
а
однострочных редактора
(см. рисунок 2.1
,
а
).
Рисунок
2
.
1
–
Вид о
кна с двумя
однострочными редакторами в нормальном (
а
) и в свернутом состоянии (
б
)
Однако н
а рисунке 2.1,
б
видно,
что
попытка
уменьшения
размера окна приводит к
нарушению внешнего вида, в результате которого
виджеты
вообще могут исчезнуть из
поля зрения.
Следовательно, при ручной компоновке
пришлось бы
программировать
,
как
должен изменяться внешний вид окна при и
з
менении его размеров.
В отличие от ручного варианта п
ри компоновке
с использованием
менеджеров
ко
м-
поновки
осуществляется
автоматическая
перестрой
ка внешнего вида окна в зависимости
от
его
разм
е
ров.
В
Qt
предусмотрены следующие
элементы
компоновки:
QVBoxLayout
–
вертикальный компоновщик
–
управля
ет
расположением видж
е-
тов в окне
по вертикали
;
Q
H
BoxLayout
–
горизонтальный компоновщик
–
управля
е
т расп
оложением
виджетов в окне
по горизонтали
;
QGridLayout
–
табличный компоновщик
–
управляет расположением виджетов
в направляющей двумерной сетке
–
матрице или таблице
.
Пример 2.
3
.
Автоматическая к
омпоновка
виджетов в окне
QtGu;i000;#include QtGui
int main(int argc
, char *argv[])
{
QApplication app(argc, argv);
QLineEdit *edit1=new QLineEdit("Edit1",&window);
QLineEdit *edit2=new QLineEdit("Edit2",&win
dow);
QHBoxLayout *layout = new QHBoxLayout;
//
выравнивание
по
//
горизонтали
layout
-
//
внешние
поля
о
кна
layout
-
(5);
//
просвет
между
виджетами
window
.
(
layout
);
//
связыва
ние
layout
с
виджетом
окна
//
задание
порядк
а
следования элементов
layout
-
(
edit
1);
layout
-
window.show();
app
.
exec
();
}
В результате работы приложения получаем интерфейс, который при изменении ра
з-
меров окна сохраняет пропорции (см. рисунок
2.2
,
а
-
б
).
Рисунок
2
.
2
–
Внешний вид инте
рфейса при автоматической компоновке виджетов:
а
–
исходное окно;
б
–
окно после уменьшения размеров;
в
–
окно при смене типа компоновщика
Замена элемента горизонтальной компоновки на вертикальную приводит к тому, что
окошки редакторов размещаются вертикал
ьно, один над другим (см. рисунок 2.2,
в
).
QVBoxLayout
*
layout
=
new
QVBoxLayout
;
Табличная к
омпоновка предполагает задание координат размещения ко
м
понентов
с
точностью до клетки
. П
ри этом допускается размещать виджет в нескольких клетках.
Для
добавлени
я виджетов в
менеджер
компонов
ки
использу
ют
специальный метод, позв
о
л
я-
ющий указать область таблицы, которую должен занимать элемент:
QGridLayout
::
(
*
,
//
размещаемый
виджет
int
fromRow
,
int
fromColumn
,
//
координаты
верхней
левой
ячейки
int
rowSpan
,
int
columnSpan
,
//
количество ячеек по горизонтали и
//
вертикали соответственно
Qt
::
Alignment
alignment
=0);
//
спороб выравнивания
Пример 2.
4
.
Применение
табличного
компоновщика.
QtGu;i000;#include QtGui
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Q
LineEdit *edit1=new QLineEdit("Edit1",&wind
ow);
QLineEdit *edit2=new QLineEdit("Edit2",&window);
QLineEdit *edit3=new QLineEdit("Edit3",&window);
QGridLayout *layout = new QGridLayout;
//
выравнивание
по
сетке
layout
-
//
устанавливаем
внешние
поля
l
ayout
-
//
устанавливаем
интервал
между
виджетами
//
связываем
layout
с
виджетом
окна
layout
-
layout
-
layout
-
window
.show();
app
.
exec
();
}
Результат работы программы показан на рисунке 2.3.
Рисунок
2
.
3
–
Применение табличной компоновки
Для реализации
©
поджатия
ª
виджетов одного к другому используют ©пружиныª.
Виджеты, поджатые пружиной, при увеличении размеров окна
остаются рядом.
Для добавления пружины используют метод
класса
QBo
x
Layout
:
void
QBoxLayout
::
(
int
=0);
Пример
2.
5
.
Применение
пружины
.
…
QVBoxLayout
*
layout
=
new
QVBoxLa
yout
;
layout
-
layout
-
layout
-
…
На рисунке 2.4 показан эффект использования пружины:
размер окон редакторов и
расстояние между
строчны
ми
редактор
ами минимально независимо от размеров окна
.
Рисунок
2
.
4
–
Использование ©пружиныª для поджатия виджетов
Следует иметь в виду, что управление
размерами виджетов
, осуществляемое
мен
е-
д
жерами компоновки
,
регулируется
параметрами растяжения и политиками, отдельно з
а-
д
аваемыми по горизонтали и вертикали
[1]
.
Разделители.
Вместо
менеджеров
компоновки
, которые
обычно
используют пол
и-
тики
пропорционально
го
изменени
я
размеров виджетов при изменении размеров форм,
можно использовать
разделители
QSplitter
, которые позволяют
регулировать
размеры
виджетов по жел
а
нию пользователя.
Разделители бывают вертикальными и горизонтальными. Их
применяют в качестве
объекта основы окна или его фрагмента.
Пример 2.
6
.
Применение
разделителя
.
#
include
QtGui
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QSplitter splitter(Qt::Horizontal);
QLineEdit *edit1=new QLineEdit("Edit1",&splitter);
QLineEdit *edit2=new QLineEdit("Edit2",&splitter);
splitter.show();
}
Р
езультат работы программы представлен на рисунке 2.5. Линия между двумя
редакторами
–
ползунок, потянув за который можно изменить соотношение областей,
отведенных по каждый редактор.
Рисунок
2
.
5
–
Применение разделителя
Компоновщики все
х
рассмотренных типов могут
вкладываться один в другой в с
о-
ответствии с реализуемой схемой
окна
. О
днако при добавлении компоновщика в конте
й-
нер другого компоновщика используется
не метод
(), а
метод
addLayout
()
, н
а
пример:
l
ayout
2
-
addLayout
(
layout
1
);
.
В
ложение
различных видов
компоновщиков
, пружин и ползунков
позволяет реал
и-
зовать
практически любые
варианты компоновки.
2.3
Механизм слотов и сигналов
П
ри использовании
Qt
п
ередача сообщений внутри п
риложения реализуется
мех
а-
низм
ом
слотов и сигналов
.
Это
–
наиболее важный
механизм
Qt
, отличающий его от др
у-
гих библиотек интерфейсных элементов
C
++
, например
©роднойª библиотеки
Visual
C
++
–
MFC
.
Как уже упоминалось ранее механизм реализуется компиляторо
м
MOC
, который г
е-
нерирует соответствующий код на ©чистомª С++.
По правилам
Qt
л
юбой виджет может
посылать сигналы другим виджетам, сообщая
им об изменениях, произошедших с ним в процессе функционирования.
Чаще всего
п
р
и-
чиной формирования сигнала бы
вают
д
ействия пользователя.
Например, объекты класса
QPushButton
посылают приложению сигнал
clicked()
, когда пользователь щелкает
мышкой по реализуемой им кнопке.
Причинами генерации сигналов могут быть и дост
и-
жения каких
-
либо значений, срабатывания таймеров, де
йствия операционной си
с
темы или
других пр
и
ложений.
Посредством специального оператора
Qt
connect
каждый сигнал может быть
подключен к одному или нескольким слотам других виджетов
. Тогда каждый раз при п
о-
лучении сигнала в виджетах
-
получателях будет активиз
ироваться соответствующий
обр
а-
ботчик сигналов
–
слот
или последовательно несколько слотов
.
В качестве слота может
объявляться
любой (перегруженный
,
виртуальный, общий,
защищенный, закрытый) метод, который дополнительно о
бъявлен
слот
ом
,
что
п
о
зволяю
т
подкл
ючать его к сигналу.
Такой
метод
также
сохраняет возможность
традиционного
в
ы-
зова, не связанного с сигналом.
Точно так
же,
как
о
дин сигнал может быть подключен к нескольким слотам
,
к
одн
о-
му слоту может быть подключено несколько сигналов
.
В
после
случае при
ложение од
и-
наково реагирует на разные сигналы.
Соединяемые сигналы и слоты должны иметь идентичные сигнатуры (т.е. колич
е-
с
т
во и типы входных аргументов).
Исключение
м
является
случай, когда сигнал имеет
бол
ь
шее число аргументов, чем слот. В этом случае "ли
шние" аргументы просто не пер
е-
даю
т
ся в слот.
Если типы входных аргументов не совместимы, или сигнал или слот не
опред
е
лены, Qt выдаст предупреждение
во время
вы
полнения
программы
. Точно так же Qt
отре
а
гирует
, если в сигнатуры сигналов или слотов
в
макросе
connect()
включены им
е-
на а
р
гументов.
2.3.1
Создание новых слотов и установка связи сигналов со слотами
Программист, использующий
Qt
, имеет возможность не только использовать пре
д-
о
пределенные
сигналы и
слоты, но и создавать новые.
При этом следует следить, чтобы
классы, определяющие новые сигналы и слоты, обязательно включали макрос
Q
_
OBJECT
,
обрабатываемый
MOC
.
Пример 2.
7
.
Прил
о
жение ©Возведение числа в квадратª.
Создание новых слотов.
На рисунке 2.6 представлено окно создаваемого приложения в разные моменты вр
е-
м
ени.
В момент запуска приложения кнопка
Следующее не активна, поскольку нажатие
на нее бессмысленно. При выдаче результата эта кнопка становится доступной, но стро
ч-
ный редактор, используемый для ввода значения,
–
блокируется, чтобы предотвратить и
з-
менение
исходных данных и, как следствие, демонстрации на экране результата, не св
я-
занного с исходными данными.
Ввод будем считать завершенным, если пользователь нажимает клавиши
Enter
или
Tab
клавиатуры или щелкает мышью вне поля ввода. При этом строчный редактор
тер
я
ет
фокус ввода. При вводе неправильных (например, буквенных) исходных данных прил
о-
жение должно выдавать сообщ
е
ние об ошибке в специальном окне.
Рисунок
2
.
6
–
Окно приложения
:
при запуске программы
(
а
)
, при выдаче результата
(
б
)
Создание приложения начинаем с описания класса окна
Win
.
Этот к
ласс, кроме ра
м-
ки, меток, строчных редакторов и кнопок должен включать
:
объект класса
QTextCodec
–
для русификации интерфейса;
менеджеры вертикальной и горизонтально
й компоновки.
Поскольку в качестве сигнала завершения ввода мы собираемся использовать
–
сигнал нажатия клавиши
Enter
, к
роме класса окна нам понад
о
бится
описать специальный класс валидатора
StrValidator
, наследуемый
от класса
QValidator
.
О
бъект этого класса
,
включа
ющ
его
метод проверки
вводимой строки
validate
()
,
передается строчному редактору, осуществля
ющему
ввод
.
При завершении ввода
этот м
е-
тод
вызывается
автоматически
. Если этот метод возвращает
Acceptable
, то редактор
ввода генерирует с
игналы
editingFinished
()
–
завершение редактирования
и
–
сигнал нажатия клавиши
Enter
.
В противном случае эти сигналы не
генерируются.
О
писываем
ый нами м
е
тод
всегда принима
ет
вводимую строку.
Проверка
же вводимой строки будет осущ
е
ствляться п
озднее.
Окончательно получаем следующий ф
айл
win
.
h
:
#ifndef win_h
#define win_h
QtGu;i000;#include QtGui
//
класс
окна
{
Q
_
OBJECT
// макрос
Qt
, обеспечивающий корректное создание сигналов и слотов
p
rotected
:
QTextCodec *c
odec;
QFrame *frame;
//
рамка
QLabel *inputLabel;
//
метка
ввода
QLineEdit *inputEdit;
//
строчный
редактор
ввода
QLabel *outputLabel;
//
метка
вывода
QLineEdit *outputEdit;
//
строчный
редактор
вывода
QPushButton *nextButton;
//
кнопка
Следующее
QPushButton *exitButton;
//
кнопка
Выход
public:
Win
(
*
parent
= 0);
//
конструктор
public slots:
void
begin
();
//
метод начальной н
а
стройки интерфейса
void
c
a
lc
();
//
метод реализации вычислений
};
class
StrValidator
:
public
QValidator
//
класс
компонента
проверки
ввода
{
public:
StrValidator(QObject *parent):QValidator(parent){}
virtual State validate(QString &str,int &pos)con
st
{
Acceptable
;
// метод всегда принимает вводимую строку
}
};
#
endif
Класс окна добавляет к множеству стандартно объявленных слотов еще два слота
–
методы начальной настройки и реализации вычислений:
public
slots
:
void
begin
(
);
//
метод начальной настройки интерфейса
void
c
a
lc
();
//
метод реализации вычислений
после этого указанные методы могут подключаться к сигналам с использованием
оператора
Qt
connect
.
Файл реализации
win
.
cpp
содержит описание
трех
методов класса окна
. При этом
конструктор создает все необходимые объекты и строит окно, метод начальной настройки
настраивает компоненты интерфейса на ввод, делая невидимыми окно вывода и его метку,
метод вычислений выполняет необходимые преобразования и
расчеты, а также
перестраивает интерфейс на вывод результатов:
#include
"win.h"
{
codec = QTextCodec::codecForName(
"Windows
-
1251"
);
-
toUnicode(
"
Возведение
в
квадрат
"
));
frame =
ne
w
QFrame(
this
);
frame
-
frame
-
inputLabel =
new
QLabel(codec
-
toUnicode(
"
Введите
число
:"
),
this
);
inputEdit =
new
QLineEdit(
""
,
this
);
StrValidator *v=
new
StrValidato
r(inputEdit);
inputEdit
-
outputLabel =
new
QLabel(codec
-
toUnicode(
"
Результат
:"
),
this
);
outputEdit =
new
QLineEdit(
""
,
this
);
nextButton =
new
QPushButton(codec
-
toUnicode(
"
Следующее
"
),
this
);
exitBut
ton =
new
QPushButton(codec
-
toUnicode(
"
Выход
"
),
this
);
// компоновка приложения выполняется согласно рисунку 2.
QVBoxLayout *vLayout1 =
new
QVBoxLayout(frame);
vLayout1
-
vLayout1
-
t);
vLayout1
-
vLayout1
-
vLayout1
-
QVBoxLayout *vLayout2 =
new
QVBoxLayout();
vLayout2
-
vLayout2
-
vLayout2
-
h();
QHBoxLayout *hLayout =
new
QHBoxLayout(
this
);
hLayout
-
hLayout
-
addLayout(vLayout2);
begin();
connect(exitButton,
SIGNAL
(clicked(
bool
)),
this
,
SLOT
(close()));
connect(nextButton,
SIGNAL
(clicked(
boo
l
)),
this
,
SLOT
(begin()));
connect(inputEdit,
SIGNAL
this
,
SLOT
(calc()));
}
void
Win::begin()
{
inputEdit
-
clear();
nextButton
-
false
);
nextButton
-
false
);
inputEdit
-
led(
true
);
outputLabel
-
false
);
outputEdit
-
false
);
outputEdit
-
false
);
inputEdit
-
}
void
Win::calc()
{
bool
Ok=
true
;
float
r,a;
QString str=inputEdit
-
text();
a=str.toDouble(&Ok
);
if
(Ok)
{
r=a*a;
outputEdit
-
inputEdit
-
false
);
outputLabel
-
true
);
outputEdit
-
true
);
nextButton
-
true
);
n
extButton
-
true
);
nextButton
-
}
else
if
(!str.isEmpty())
{
QMessageBox msgBox(QMessageBox::Information,
codec
-
toUnicode(
"
Возведение
в
квадрат
."
),
codec
-
toU
nicode(
"Введено неверное значение."
),
QMessageBox::Ok);
msgBox.exec();
}
}
Рисунок
2
.
7
–
Схема компоновки интерфейса
приложения
Основная прог
рамма данного примера
помещается в файл
main
.
cpp
:
#include "win.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Win win(0);
win.show();
}
Метод
c
a
lc
()
, реализующий основную обработку, проверяет правильность ввода
данных и выдает окно сообщения, если данные введены неверно.
При этом используется
прямой вызов метода
вывода окна сообщения
QMessage
:
:
exec
()
. Эту же операцию
можно осуществить, создав новый сигнал, который генерируется, если обнаруживается
ошибка да
н
ных.
2.3.2
Генерация новых сигналов
Аналогично новым слотам новые сигналы должны быть объявлены в классе, объе
к-
ты которого этот сигнал генерируют:
signals
:
void
input
_
error
();
Сама генерация выполняется специальным оператором
Qt
:
emit
input
_
error
();
Пример 2.
8
.
П
рил
о
жение ©
Счетчик
ª. Генерация нового сигнала.
В качестве примера разработаем приложение, которое считает отдельные нажатия на
кнопку и серии по пять нажатий (см. рисунок 2.
8
).
Рисунок
2
.
8
–
Внешний вид с
четчика нажатий
На
рисунк
е
2.
9
приведена диаграмма взаимодействия объектов приложения
в пр
о-
цессе работы
посредством
генерации
и обработки сигналов (сообщения
созд
а-
ния
/
уничтожения объектов и изменения их размеров в процессе компоновки
не показаны,
чтобы не
у
с
ложнять рисунок).
Таким образом оба объекта счетчиков должны уметь увеличивать свое содержимое
на единицу, т.е. включать соответствующий метод
–
слот. А первый счетчик еще и должен
г
е
нерировать сигнал по достижении пяти нажатий.
Рисунок
2
.
9
–
Сигналы в приложении
Оба счетчика будем строить на базе одного класса
Counter
, наследуемого от
QLineEdit
.
В производном классе
предусмотрим соответствующие сигнал
tick
_
signal
()
и слот
ad
d
_
one
()
(
см. р
и
сунок
2.
10
)
.
Рисунок
2
.
10
–
Структура класса
Cou
n
ter
Описание класса
Counter
можно поместить в отдельный файл, но для простоты чт
е-
ния программы включим его в фа
йл
win
.
h
вместе с описанием класса окна
:
#
ifndef
win
_
h
#
define
win
_
h
#
include
QtGui
class
Counter
:
public
QLineEdit
{
Q_OBJECT
public:
Counter
QLineEdit(contents,parent){}
signals:
void
tic
k_
signal();
public slots:
void add_one()
{
QString str=text();
int r=str.toInt();
if (r!=0 && r%5 ==0)
emit
tick_
signal()
;
r++;
}
};
{
Q_OBJECT
p
rotected
:
QTextCodec *codec;
QLabel *label1,*label2;
Counter
*edit1,*edit2;
QPushButton *c
a
lcbutton;
QPushButton *exitbutton;
public:
};
#
endif
#
include
"
win
.
h
"
Файл
win
.
cpp
в этом случае содержи
т только описание конструктора класса окна:
{
codec = QTextCodec::codecForName(
"
Windows
-
1251
"
);
this
-
codec
-
toUnicode
(
"
Счетчик
"
));
label1 = new QLabel(
codec
-
toUnicode
(
"
C
чет
по
1
"
),this)
;
label2 = new QLabel(
codec
-
toUnicode
(
"
C
чет
по
5
"
),this);
edit1 = new
Counter
(
"
0
"
,this);
edit2 = new
Counter
(
"
0
"
,this);
c
a
lcbutton=new QPushButton(
"
+1
"
,this);
exitbutton=new QPushButton(
codec
-
toUnicode
(
"
Выход
"
),this);
QHBoxL
ayout
*
layout1 = new QHBoxLayout();
layout1
-
layout1
-
QHBoxLayout
*
layout2 = new QHBoxLayout();
layout2
-
layout2
-
QHBoxLayout
*
layout3 = new QHBoxLay
out();
layout3
-
layout3
-
QVBoxLayout
*
layout4 = new QVBoxLayout(this);
layout4
-
addLayout(layout1);
layout4
-
addLayout(layout2);
layout4
-
addLayout(layout3);
// связь сигнала н
ажатия кнопки и слота закрытия окна
connect(c
a
lcbutton,SIGNAL(clicked(bool)),
edit1,SLOT(add_one()));
connect(edit1,SIGNAL(
tick_
signal()),
edit2,SLOT(add_one()));
connect(exitbutton,SIGNAL(clicked(bool)),
thi
s
,
SLOT
(
close
()));
}
Файл
main
.
cpp
не отличается от соответствующих файлов предыдущих программ:
#include "win.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Win win(0);
win.show();
}
Связь
©сигнал
-
слотª
устанавливается между объектами на этапе выполнения, поэт
о-
му она
может быть разорва
на при использовании операции
disconnect
()
.
Однако
н
е
обходимости рассоединять
объекты
обычно не
возникает
, поскольку связь автоматич
е-
ски разрывается при уничтожении л
юбого из объектов в ней участвующих.
2.4
Обработка событий
.
Рисование.
События таймера
Обо всех изменениях, зафиксированных операционной системой, приложение
узн
а-
ет при получении соответствующих сообщений
операционной системы
. Так нажатие и
отпускание клавиш
клавиатуры и мыши инициируют сообщения соответственно
от
кл
а
в
и-
атуры и мыши, перемещение окон на экране, в результате которых открываются ранее з
а-
крытые фрагменты окна
,
–
сообщени
я
перерисовки окна и т.п.
В большинстве случаев сообщения генерируются систе
мой в ответ на действ
ия
пользователя, но причиной генерации новых сообщений могут быть также сигналы та
й-
мера или запросы, пришедшие по с
е
ти.
Все сообщения операционной системы поступают в очередь сообщений прилож
е-
ния, откуда выбираются
приложением
для пос
ледующей обработки. Результатом этой о
б-
работки явля
е
тся
активизация соответствующих событий.
Таким образом, в
отличие от сигналов, которые используются для
организации
вз
а-
имодействия
виджет
ов
,
события служат для передачи виджетам информации от опер
а
ц
и-
онн
ой системы.
Как правило, необходимости в обработке событий при работе с виджетами не возн
и-
кает: обработка большинства событий уже выполняется методами виджетов
,
и в результ
а-
те этой обработки
формируют
ся
необходимые сигналы
.
Так при щелчке пользователя по
к
нопке
QPushButton
виджет кнопки обрабатывает событие Нажатие на Кнопку и форм
и-
рует сигнал
clicked
()
.
Но при необходимости
возможно создание
нестандартных
обр
а-
ботчиков
с
о
бытий.
Одним из случаев, когда приходится выполнять обработку событий, является рис
о-
ван
ие.
Рисование в простейшем варианте выполняется с помощью объекта класса
QPain
t-
er
. Объект этого класса получает доступ к фрагменту экрана, отведенному под окно, в
кот
о
ром выполняется рисование.
Само рисование программируют в обработчике события перерисо
вки
paintEvent
()
, тогда каждый раз при перерисовке окна (например, когда окно появл
я-
ется из
-
за других окон) рисунок возобновляется.
Кроме того, при использовании этого с
о-
бытия необходимость в стирании рисунка отпадает. Вместо этого следует обеспечить п
е-
рер
исовку окна при изменении положения фигур.
Такую перерисовку обеспечивают м
е-
тоды
QWidget
update
()
и
repaint
()
. Использование
update
()
предпочтительно,
так как метод сам определяет целесообразность немедленной перерисовки, приспосабл
и-
ваясь к скорости измене
ния рисунка (при слишком большой частоте перерисовки она б
у-
дет в
ы
полняться не каждый раз).
При создании движущегося изображения сигнал на перерисовку смещенного из
о
б-
ражения целесообразно получать от таймера. Приложение, использующее средства
Qt
,
может созд
авать произвольное количество таймеров с разными временными интервалами.
Для этого используется функция
класса
QObject
:
int
startTimer
(
В
ременной интервал в мс
)
.
Число, возвращаемое функцией
–
номер таймера. Этот номер необходимо проверить,
когда активиз
ируется событие
timerEvent
()
, чтобы быть уверенным, что обрабатыв
а-
ется сигнал от нужного таймера.
Для прекращения работы таймера используют функцию
того же класса.
void
killTimer
(
Номер таймера
)
Пример 2.
9
.
Создание движущихся изображений. Обработка собы
ти
я
от таймера
,
событий
визуализации и сокрытия окна, а также события перерисовки окна.
Пусть необходимо создать приложение, в окне которого вращаются вокруг сво
их
геометрическ
их
центр
ов
линия и квадрат (см. рисунок
2.1
1
)
.
Рисунок
2
.
11
–
Внешний вид окна приложения
Приложение будет состоять из 6 объектов: Окно, Кнопка, Холст, Таймер, Линия и
Квадрат, не считая объекта самого приложения
(см. рисунок 2.1
2
)
. При этом о
бъект Окно
будет
отвеча
ть
за создание сво
их компонентов:
Холст (
поля рисования
)
и
К
нопки, их в
и-
зуализацию и уничтожение. Основное назначение Кнопки
–
инициировать закрытие пр
и-
ложения. Холст
будет
отвеча
ть
за создание и уничтожение Таймера, а также за рисование
пошагово перемещаемых
фигур
Линия и
Квадрат
при обработке сигналов
Т
айм
е
ра.
Рисунок
2
.
12
–
Фрагмент объектной декомпозиции приложения
(без сообщений создания и уничтожения
объектов)
Запускать таймер будем при визу
ализации Холста в обработчике события
showEvent
()
, а выключать
–
при его сокрытии (в обработчике
hideEvent
()
).
Таким
образом всего обработываем четыре типа событий:
showEvent
()
–
включение таймера;
timerEvent()
–
инициация перерисовки Холста;
paintEvent
()
–
рисование пошагово перемещающихся фигур;
hide
Event
()
–
выключение таймера.
Для уточнения взаимодействия объектов построим диаграмму последовательности
действий (см. рисунок 2.1
3
).
Рисунок
2
.
13
–
Диаграмма последовательности действий приложения
На рисунке 2.1
4
показана диаграмма классов приложения. Классы
MyLine
и
MyRect
наследуем от абстрактного класса
Figura
. При этом используем сложный полиморфизм,
поскольку
переопределяемы
й в иерархии
метод рисовая
draw
()
будет вызываться из
мет
о-
д
а
move
()
базового класса.
Рисунок
2
.
14
–
Диаграмма классов приложения
В соответствии с рекомендациями С++ п
рило
жение
декомпозируем на 7 файлов, з
а-
висимость между которыми представлена на рисунке 2.1
5
. Шесть из семи файлов образ
у-
ют три модуля,
хранящих
описания отдельных классов или групп классов. А седьмой
файл
main
.
cpp
содержит основную программу.
Рисунок
2
.
15
–
Диаграмма компоновки приложения
Файл
figura
.
h
содержит описания классов
Figura
,
MyLine
и
MyRect
:
#ifndef figura_h
#define figura_h
#include Q
t
Gui
class Figura
{
protected:
in
t x,y,halflen,dx,dy,r;
virtual void draw(QPainter *Painter)=0;
public:
Figura(int X,int Y,int Halflen):
x(X),y(Y),halflen(Halflen){}
void move(float Alpha,QPainter *Painter);
};
class MyLine:public Figura
{
protected:
void draw(QPainter *Painter);
public:
MyLine(int x,int y,int halflen):Figura(x,y,halflen){}
};
class MyRect:public Figura
{
protected:
void draw(QPainter *Painter);
public:
MyRect(int x,int y,int halflen):Figura(x,y,halflen){}
};
#endif
Файл
figura
.
cpp
со
держит описание методов этих же классов:
math;.h00;#include math.h
#include "figura.h"
void Figura::move(float Alpha,QPainter *Painter)
{
dx=halflen*cos(Alpha);
dy=halflen*sin(Alpha);
draw(Painter);
}
void MyLine::draw(QPain
ter *Painter)
{
Painter
-
drawLine(x+dx,y+dy,x
-
dx,y
-
dy);
}
void MyRect::draw(QPainter *Painter)
{
Painter
-
drawLine(x+dx,y+dy,x+dy,y
-
dx);
Painter
-
drawLine(x+dy,y
-
dx,x
-
dx,y
-
dy);
Painter
-
drawLine(x
-
dx,y
-
dy,x
-
dy,y+dx);
Painter
-
drawLine(x
-
dy,y+dx,x+dx,y+dy);
}
Файл
area
.
h
содержит описание класса
Area
:
#include "figura.h"
{
int myTimer;
//
идентификатор
таймера
float alpha;
//
угол
поворота
public:
~Area();
MyLine
*myline;
MyRect *myrect;
protected:
//
обработчики
событий
void paintEvent(QPaintEvent *event);
void timerEvent(QTimerEvent *event);
void showEvent(QShowEvent *event);
void hideEvent(QHideEvent *event);
};
#endif
Файл
area
.
cpp
содержи
т
описание
методов
класса
Area
,
включая
обработчики
событий
:
#include "area.h"
{
myline=new MyLine(80,100,50);
myrect=new MyRect(220,100,50);
alpha=0;
}
void Area::
showEvent
(QSho
wEvent *)
{
myTimer=startTimer(50);
//
создать
таймер
}
void Area::
paintEvent
(QPaintEvent *)
{
QPainter painter(this);
myline
-
move(alpha,&painter);
myrect
-
move(alpha*(
-
0.5),&painter);
}
void Area::
timerEvent
(QTimerEvent *event)
{
if (event
-
timerId() == myTimer)
//
если
наш
таймер
{
alpha
=
alpha
+0.2;
update
();
// обновить внешний вид
}
else
::
timerEvent
(
event
);
// иначе передать для
стандартной
//
обработки
}
void
Area
::
hideEvent
(
QHideEvent
*)
{
killTimer
(
myTimer
);
//
уни
ч
тожить таймер
}
Area
::~
Area
()
{
myline
;
del
myrect
;
}
Файл
window
.
h
содержит описание класса окна:
#ifndef window_h
#define window_h
QtGu;i000;#include QtGui
#include "area.h"
{
protected:
QTextCodec *codec;
Area * area;
//
область
отображения
рисунка
Q
PushButton * btn;
public:
Window();
};
#endif
Файл
window
.
cpp
содержит
описание
конструктора
класса
окна
:
#include "window.h"
Window::Window()
{
codec = QTextCodec::codecForName("Windows
-
1251");
this
-
codec
-
toUnicode
("
Обработка
событий
"));
area = new Area( this );
btn = new QPushButton(
codec
-
toUnicode
("
Завершить
"),this );
QVBoxLayout *layout = new QVBoxLayout(this);
layout
-
layout
-
connect(btn, SIGNAL(clicked(bool)),this
,SLOT(close()));
};
И, наконец, ф
айл
main
.
cpp
содержит основную программу
:
#include "window.h"
int main(int argc, char *argv[])
{
QApplication appl(argc, argv);
Window win;
win.show();
}
ЛИТЕРАТУРА
1.
Шлее М.
Qt
4.5/
Про
фессиональное программирование на С++.
–
СПб.: БХВ
-
Петербург, 2010.
ПРИЛОЖЕНИЕ А. УСТАНО
ВКА QT НА КОМПЬЮТЕР
Для установки библиотеки
Qt
необходимо скачать инсталляционные м
о
дули с сайта
разрабо
т
чика
http://qt.
nokia
.com
.
Фирма предлагает либо установить полный
Qt
SDK
(
Software
Development
Kit
–
ко
м-
плект средств разработки
)
под используемую операционную систему, либо самостоятел
ь-
но со
з
дать необход
имую конфигурацию средств
Qt
.
Комплект средств разработки
Qt
SDK
существуют для
Windows
, 32
-
х
и 64
-
х разря
д-
ных
Linux
,
Mac
OS
X
и
Symbian OS
. Он включает со
б
ственно библиотеку
Qt
,
бесплатный
компилятор С++
minGW
и бесплатную интегрированную среду
создания
пр
и
ложений
Qt
Creator
.
Для работы с
Qt
в среде
Qt
Creator
на компьютер необходимо установить
Qt
SDK
:
для
Windows
–
дистрибутив
qt
-
sdk
-
win
-
opensource
-
2010.05.exe
;
для
32
-
х
разрядной
Linux
–
дистрибутив
qt
-
sdk
-
linux
-
x86
-
opensource
-
2010.05.1.bin;
для
64
-
х
ра
зрядной
Linux
–
дистрибутив
qt
-
sdk
-
linux
-
x86_64
-
opensource
-
2010.05.1.bin
и
т
.
д
.
При желании комплект инструментов для работы в
Windows
, изначально настрое
н-
ный для работы с
minGW
,
можно
пере
настроить на работу с компилятором
Visual
C
++
.
Для этого необходимо
отдельно скачать библиотеку
Qt
, работающую с
Visual
C
++
и соо
т-
ветственно настроить
Qt
Creator
(меню Пр
о
ект)
.
Для работы с
Qt
в командном режиме
на компьютере должна быть установлена:
для работы с
Visual
C
++
–
библиотека
Qt
(дистрибутив
qt
-
win
-
opensource
-
4
.7.0
-
vs2008.exe
)
;
для работы с
mingw
:
o
для
Windows
–
дистрибутив
qt
-
win
-
opensource
-
4.7.0
-
mingw
.exe,
o
для
Linux
–
дистрибутив
qt
-
everywhere
-
opensource
-
src
-
4.7.1.tar.gz.
В первом случае естественно
также
должна быть установлена среда
Visual
Studio
, а
во втор
ом
–
средства компиляции, сборки и отладки С++ из
GNU
Compiler
Co
l
lection
.
Для создани
я
Qt
приложений с использованием среды
Microsoft
Visual
Studio
2008
и выше необходимо скачать и установить на компьютер специальный дистрибутив
–
би
б
лиотеку для
Visual
St
udio
(файл
-
дистрибутив
qt
-
win
-
opensource
-
4.7.
1
-
vs
2008.
exe
или
более поздние)
и плагин для среды (файл дистрибутив
qt
-
vs
-
addin
-
1.1.7.exe
или более
поздние).
Плагин встраивается в среду, добавляя специальный пункт в меню, и
позволяет
создавать приложения
Qt
ра
з
ных типов непосредственно в среде
Visual
Studio
2008
.
Русскоязычный вариант справочной системы
можно взять на сайте
http://doc.crossplatform.ru/qt/
и добавить в справочную систему согласно инструкции ра
з-
р
аботчиков.