у
Тролль на гастролях
Продолжение, начало см. в М К, № 6 (333)
Н
емного усложним наш пример. Зададимся целью соз-
дать окно с текстовой надписью и кнопкой, которое бу-
дет реагировать на действия пользователя, в частно-
сти — закрывать себя при нажатии на кнопку. Для это-
го нам придется изменить саму структуру программы. Разне-
сем ее исходный код в несколько файлов —
m ain.cpp
(точ-
ка входа в программу),
h e llo .h
(описание класса главного
окна приложения),
h e llo .срр
(реализация класса главного
окна приложения). Также нужно будет переопределить уже
существующий виджет Qt.
Вот какое содержание будет иметь
main.cpp:
ttinclude <qap p lication .h >
ttinclude "h e llo .h "
in t m ain (in t a rge, char *a rg v [] )
{
Q A pplication a (a rg c , a r g v );
h e llo *mainWidget =
new h e llo ;
a . setM ainW idget(m ainw idget);
m ainW idget->show();
retu rn a . exec () ;
}
Как можно видеть, выполняется рутинная работа, которая
является неотъемлемой частью лю бого Q t-приложения, а
именно: создание экземпляра приложения, создание и показ
на экране главного виджета, запуск приложения. Все долж-
но быть понятно, поскольку это мы уже проходили в прошлый
раз.
Вот каким будет файл
h e llo .h :
ttinclude <qhbox.h>
c la ss h e llo : p u b lic QHBox
{
Q_0BJECT
p u b lic:
h e llo ( ) ;
p u b lic s lo ts :
v o id b tn C lic k () ;
} ;
В этом случае уже требуются некоторые пояснения. Во-
первых, почему мы использовали виджет QHBox в качестве
базового класса? Дело
в то м ,
что
q h b o x
является виджетом-
контейнером, который выстраивает все дочерние виджеты по
горизонтали и автоматически подгоняет их размеры под раз-
меры самого окна. Другой способ достичь того же резуль-
тата — использование L a y o u t-классов, но об этом уж как-
нибудь потом.
Вас, наверное, сбивает столку непонятное
q_ o bject. По-
яс няю : это м а кр о с, необходимый для описания классов, у н а с-
ледованных от виджетов
Qt.
Все эти макросы обрабатыва-
ются специальным компилятором метаобъектов moc (Meta
O bject Compiler), который входит в состав
Qt.
Другой макрос, который вы можете встретить в опреде-
лении данного класса, — это s lo ts . Для того, чтобы понять
его предназначение, нужно вникнуть в концепцию сигналов
и слотов, которая используется в
Qt
для обработки событий.
Ликбез. В большинстве более «древних» библиотек (на-
пример, в
GTK+)
используется механизм
саНЬаск'ов.
Вкрат-
це
о
его сути: мы объявляем процедуру, которая называет-
ся
callback'oM ,
а затем специальной функцией, которой пе-
редается указатель на эту функцию, мы ассоциируем
c a l l -
back
с определенным событием. В
Qt
используется более
прогрессивная технология — концепция сигналов и слотов
Влад aka V.L.A.D. СВЕТЛИЧНЫЙ
(если мне не изменяет память, эта же концепция использует-
ся в игровой библиотеке
ClabLib).
Согласно этой концеп-
ции, у каждого класса-виджета есть особые методы — сиг-
налы, которые получают информацию о событиях, и слоты,
которые эту информацию обрабатывают. С помощью мето-
да
connect,
который присутствует у большинство классов,
мы создаем связь между сигналом одного объекта со слотом
другого, а с помощью метода
disconn ect
мы эту связь раз-
рушаем. На один сигнал можно навешать несколько слотов,
и наоборот — один слот может отвечать на несколько сиг-
налов. Для того, чтобы в определении класса использовать
сигналы и слоты, используются макросы
s ign a ls
и
slo ts .
Теперь поговорим о реализации класса:
ttinclude "h e llo .h "
ttinclude <qpushbutton.h>
ttinclude <qlabel.h >
ttinclude <gmessagebox.h>
ttinclude <qhbox.h>
h e llo :: h e llo ()
: QHBox(0)
{
new QLabel ("C lic k th is button: " , th is ) ;
QPushButton *helloB u tton=
new QPushB utton("H ello, w o rld !", t h is );
setM a rg in (lO );
s e tS p a c in g (lO );
s e tC a p tio n ("H e llo ");
con n ect(h elloB u tton , SIG N A L(clicked( ) ) ,
S L O T (b tn click ( ) ) ) ;
}
v o id h e llo ::b tn C lic k ()
{
Q M e s s a g e B o x ::in fo rm a tio n (th is ,"B y e !","E x itin g ");
c lo s e ( ) ;
)
Вначале разберем работу конструктора класса. Первой
строкой мы создаем экземпляр
QLabel
— текстовую надпись
«Click this button:». Возможно, вам кажется непривычным тот
факт, что мы не присваиваем этот объект какой-нибудь пе
ременной, но в данном случае это не нужно, поскольку этот
виджет не выполняет никакой функции приложения, кроме
информативной. Далее создаем экземпляр кнопки с надпи-
сью «Hello, world!». Тут все должно быть понятным.
М етодом
setM argin
мы устанавливаем «окантовку» окна
шириной в десять пикселей, а
setspacin g
устанавливает та-
кое же расстояние между дочерними виджетами,
setcap-
tio n
отвечает за заголовок окна.
И вот мы сталкиваемся с практическим применением кон-
цепции сигналов и слотов. Метод
connect
имеет два пере-
гружаемых определения:
b ool QObject: :connect (const QObject ‘ sender, con-
s t char »s ig n a l, con st QObject »r e c e iv e r , con st char
»member ) — создает связь между сигналом sign a l объекта
sender и слотом member объекта rec e iv e r.
bool QObject: :connect ( const QObject »sender, con-
s t char »s ig n a l, const char »member
) — то же самое, толь-
ко в качестве
r e c e iv e r
используется
th is;
создается связь
между сигналом
sig n a l
объекта
sender
и слотом
member
те-
кущего объекта.
Макроопределения
s ig n a l и slo t
преобразовывают дан-
ную им функцию-член в строку символов. В нашем случае
кь. Окончание на стр. 41
МОЙ
КОМПЬЮТЕР
предыдущая страница 39 Мой Компьютер 2005 09 читать онлайн следующая страница 41 Мой Компьютер 2005 09 читать онлайн Домой Выключить/включить текст