Тролль на гастролях
Влад aka V.L.A.D. С ВЕТЛИЧНЫ Й
Продолжение, начало см. в М К, №6, 9 (333, 336)
Использование Layout-менеджеров
С
егодня мы поговорим о
тонкостях
создания интерфей-
са программы при помощи библиотеки Qt. Довольно
часто в Интернете можно лицезреть программы, со-
стряпанные за пять минут в Delphi, которые просто
убивают своей непродуманностью. Например, перед на-
ми маленькое окошко, которое мы хотели бы раскрыть на
весь экран, курсор мышки так и тянется к правому верхне-
му углу окна. Но когда мы нажимаем на кнопку «Развер-
нуть на весь экран», большая часть окна оказывается пус-
той, а в левом верхнем углу ютятся в тесноте кнопочки. Мы
не станем повторять такие ошибки, поэтому забудем о ме-
тоде
s e t G e o m e t r y ,
который имеется в наличии у всех вид-
жетов в Qt. Хорошим тоном в программировании интер-
фейса считается вариант, когда размеры виджетов авто-
матически подстраиваются под размеры окна. Как можно
этого достичь?
Первый вариант — использование классов вроде
Q H -
в о х , Q V B o x , Q G r id .
Они инкапсулируют в себе работу с
Layout-менеджерами, так что компоновка виджетов осуще-
ствляется автоматически. Этот подход мы использоволи в
предыдущей программе, когда подключали
qhbox.
Н
о
что
делать, если нужно создать более сложный интерфейс? Мож-
но помещать один контейнер внутри другого, для этого в
параметрах к конструктору класса передаем указатель на
родительский виджет. Но представьте, что будет, если в ок-
не программы окажется несколько десятков виджетов-кон-
тейнеров, вложенных друг в друга. Поскольку
Q H B o x , Q V B o x ,
Q G r id
являются потомками класса
Q W id g e t
(который от-
Ь
нюдь не самый «легкий» в плане использования системных
ресурсов), то при создании очередного экземпляра будет
расходоваться дополнительная порция бесценной опера-
тивной памяти.
Второй вариант, более прогрессивный, — это использо-
воние Layout-менеджеров
Q L a y o u t , Q H B o x L a y o u t, Q V B o x L a y -
o u t , Q G r id L a y o u t .
Они не являются виджетами (а значит,
не наследуют
Q W id g e t) .
В переводе с английского слово «Lay-
out» означает «план, разметка». То есть Loyout-менеджеры
создают план, по которому будут размещаться дочерние вид-
жеты на родительском. Для их использования нужно подклю-
чить заголовочный файл
l a y o u t . h .
Если вы хотите добавить
на виджет Layout, то просто создайте экземпляр нужного
класса-менеждера, указав при этом данный виджет в каче-
стве родительского. Чтобы добавить существующий виджет,
используется метод
a d d w id g e t ,
а для добавления дочерней
«разметки» —
a d d L a y o u t .
Для усвоения материала приведу несколько примеров.
В отельной папке
l a y o u t
создадим новый проект —
l a y -
o u t . p r o :
T E M P L A T E = a p p
IN C L U D E P A T H + = .
H E AD ER S + = l a y o u t , h
SOURCES + = l a y o u t . c p p m a in , c p p
Ф а й л m a in . c p p н а п о л н и м с л е д у ю щ и м с о д е р ж а н и е м :
t t i n c l u d e < q a p p l i c a t i o n . h >
t t i n c l u d e " l a y o u t . h "
i n t m a i n t i n t a r g e , c h a r * a r g v [ ] )
{
Q A p p l i c a t i o n a ( a r g c , a r g v ) ;
l a y o u t * m a in w id g e t =
n e w l a y o u t ;
a . s e t M a in W id g e t ( m a in W i d g e t ) ;
m a in W id g e t - > s h o w ( ) ;
r e t u r n a . e x e c ( ) ;
}
При определении класса
l a y o u t
в заголовочном файле
l a y o u t . h
будем предельно лаконичны ©:
t t i n c l u d e < q w id g e t . h >
c l a s s l a y o u t : p u b l i c Q W id g e t
{
Q _O B JE C T
p u b l i c :
l a y o u t ( ) ;
} ;
Ну, а теперь собственно реализация программы —
l a y -
o u t . c p p :
t t i n c l u d e " l a y o u t . h "
t t i n c l u d e < q p u s h b u t t o n . h >
t t i n c l u d e < q l a y o u t . h >
l a y o u t : : l a y o u t ( )
-. Q W id g e t ( 0 )
{
s e t C a p t i o n ( " L a y o u t E x a m p le N o l " ) ;
Q P u s h B u tt o n * b l= n e w Q P u s h B u t t o n ( " F i r s t B u t t o n " ,
t h i s ) ;
Q P u s h B u tt o n * b 2 = n e w Q P u s h B u t t o n ( " S e c o n d B u t t o n " ,
t h i s ) ;
Q P u s h B u tt o n * b 3 = n e w Q P u s h B u t t o n ( " T h i r d B u t t o n " ,
t h i s ) ;
Q P u s h B u tt o n * b 4 = n e w Q P u s h B u tt o n ( " F o u r t h B u t t o n " ,
t h i s ) ;
Q P u s h B u tt o n * b 5 = n e w Q P u s h B u t t o n ( " F i f t h B u t t o n " ,
t h i s ) ;
Q P u s h B u tt o n * b 6 = n e w Q P u s h B u tt o n ( " S i x t h B u t t o n " ,
t h i s ) ;
Q P u s h B u tt o n * b 7 = n e w Q P u s h B u t t o n ( " S e v e n t h B u t t o n " ,
t h i s ) ;
Q G r id L a y o u t * g r i d L a y o u t = n e w
Q G r i d L a y o u t ( t h i s , 4 , 2 , 1 0 , 1 0 ) ;
g r i d L a y o u t - > a d d W i d g e t ( b l , 0 , 0 ) ;
g r i d L a y o u t - » a d d w i d g e t ( b 2 , 1 , 0 ) ;
g r i d L a y o u t - > a d d w i d g e t ( b 3 , 2 , 0 ) ;
g r i d L a y o u t - > a d d w i d g e t ( b 4 , 3 , 0 ) ;
g r i d L a y o u t - > a d d W i d g e t ( b 5 , 0 , l ) ;
g r i d L a y o u t - » a d d w i d g e t ( b 6 , 1 , 1 ) ;
g r i d L a y o u t - » a d d w i d g e t ( b 7 , 3 , 1 ) ;
>
Вначале мы создаем семь кнопок:
Ы - Ь 7 .
Затем добавля-
ем на виджет главного окна новую «разметку»
Q G r id L a y -
o u t
— виджеты будут выстраиваться по прямоугольной сет-
ке. Здесь необходимо сказать пару слов о парометрах нои-
более часто используемого ее конструктора (в Qt очень час-
то один класс имеет по десятку перегружаемых конструкто-
ров ©):
Q G r id L a y o u t ( Q W id g e t * p a r e n t , i n t n R o w S = 1 , i n t
n C o ls = 1 , i n t m a r g in = 0 , i n t s p a c e = - 1 )
p a r e n t
— родительский виджет; в данном случае —
окно
программы;
n R o w s , n C o ls
— соответственно количество строк и столб-
цов в сетке;
m a r g i n , s p a c e
— соответственно оконтовка виджета и
расстояние между дочерними виджетами (в пикселях); резуль-
тат тот же самый, что и при использовонии методов
s e t -
M a r g in
и
s e t s p a c i n g .
После создания «разметки» мы начинаем добавлять на
нее виджеты при помощи
a d d w id g e t ,
указывая в паромет-
рох этого метода указатель на объект и позицию виджета в
1
12/339
21
марта
-28
марта
2005
предыдущая страница 40 Мой Компьютер 2005 12 читать онлайн следующая страница 42 Мой Компьютер 2005 12 читать онлайн Домой Выключить/включить текст