Рассмотрим процесс проектирования приложений с использованием Qt Creator. При запуске среды Qt Creator на экране появляется окно Начало работы (см. рисунок 1.15)


Чтобы посмотреть этот 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,
Google

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

&#xQtGu;&#xi000;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

&#xQtGu;&#xi000;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

&#xQtGu;&#xi000;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
,
должен
вы
зыват
ь

этот метод для построения о
к
на:


&#xQtGu;&#xi000;#include QtGui

&#xWin.;&#xh000;#include Win.h


{


;
// конструирование формы

};

После этого о
сновной программе остается только создать объект
-
приложение

и

об
ъ-
ект
-
окно, виз
уализировать форму и ее виджеты и запустить цикл обработки сообщ
е
ний:

&#xQApp;&#xlica;&#xtion;#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

&#xQtGu;&#xi/QA; tio;&#xn000;#include QtGui/QAction

&#xQtGu;&#xi/QA;&#xppli;Êti;&#xon00;#include QtGui/QApplication

#include QtGui/QButtonGrou
�p

&#xQtGu;&#xi/QH; oxL; you;&#xt000;#include QtGui/QHBoxLayout

&#xQtGu;&#xi/QH;&#xrVie;&#xw000;#include QtGui/QHeaderView

&#xQtGu;&#xi/QL;ાl;#include QtGui/QLabel

&#xQtGu;&#xi/QP;&#xushB;&#xutto;&#xn000;#include QtGui/QPushButton

&#xQtGu;&#xi/QV; oxL; you;&#xt000;#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
,
визуализирует окно и запускает цикл обработки сообщений:

&#xQtGu;&#xi/QA;&#xppli;Êti;&#xon00;#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.

Управление
размером
окна

посредством изменения
геометрических
свойств

корневого виджета
.

&#xQtGu;&#xi000;#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
.

Р
азмещение виджетов
-
редакторов

в окне вручную
.

&#xQtGu;&#xi000;#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
.

Автоматическая к
омпоновка

виджетов в окне


&#xQtGu;&#xi000;#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
.

Применение
табличного

компоновщика.

&#xQtGu;&#xi000;#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

&#xQtGu;&#xi000;#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

со
держит описание методов этих же классов:

&#xmath;&#x.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

&#xQtGu;&#xi000;#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/

и добавить в справочную систему согласно инструкции ра
з-
р
аботчиков.




Приложенные файлы

  • pdf 7711738
    Размер файла: 2 MB Загрузок: 0

Добавить комментарий