LINUX.ORG.RU

Вопрос по aligment'у виджетов в GTK


0

0

Доброй ночи! Я начал знакомиться с GTK 1.2 и возникла такая проблемка с созданием окошек, в которых все виджеты сами занимают доступное место в правильном порядке:

Имеется упакованные в vbox (1) несколько фреймов. В одном фрейме (2) упаковка (в vbox) из нескольких hbox (3), в каждом из которых два элемента упакованы в начале (слева), без равномерного размещения и растяжения, а один (4) - в конце (справа). Последний является hbox'ом, в котором есть равномерно (expand=TRUE) упакованные кнопка-флажок (checkbutton) (5) и vbox (6). Когда флажок-5 установлен, vbox-6 видимый (show). Когда флажок-5 сброшен, vbox-6 невидимый (hide).

Проблема в следующем: т.к. изначально все vbox-6 невидимые, то все флажки-5 находятся на одной линии по вертикали (прижаты к правому краю окна). Все остальные элементы горизонтальных упаковок (hbox-3) разного размера. Когда устанавливается какой-либо флажок-5, то появляется vbox-6 и весь hbox-4, прижатый к правому краю смещается влево, если есть место, либо растягивает все окно вправо. Т.е. когда не все флажки-5 установлены, то они не обязательно находятся на одной вертикальной линии. Далее, если после растяжения окна сбросить флажок-5, то он не вернется к правому краю, а останется где-то посередине между старым положением и правым краем. Если изменить размеры окна, то все придет в норму.

Данное поведение мне не нравится. Что предпринять для повышения единообразия?

1. Для возврата вправо наверное надо послать событие типа OnResize в виндовой терминологии. Только как подобное событие тут называется и кому его слать (окну?). Я пробовал перерисовывать окно, но это не помогает.

2. Хотелось бы, чтобы при появлении/исчезновении vbox-6 элементы не скакали в окне. Т.е. чтобы изначально все распологалось как надо (vbox-6 не виден, но он как бы есть, вместо него пустое место). Как это сделать, не высчитывая размер vbox-6 в пикселях? Можно конечно, привязать все к табличной разметке (table) внутри hbox-3, но это ведь все равно привязка к размерам (которые, в принципе, могут и поменяться).

anonymous

1. А почему бы не использовать таблицу (GtkTable) вместо vbox/hbox? 2. А gtk 1.2 это принципиально? 2.х е подходит?

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

> 1. А почему бы не использовать таблицу (GtkTable) вместо vbox/hbox?

vbox/hbox стоит использовать впаре с таблицей, просто в них вставлять виджеты - не очень красиво, когда при изменении размера окна изменяются пропорционально и размеры кнопок etc - а боксы в самый раз для компоновки групп виджетов.

> 2. А gtk 1.2 это принципиально? 2.х е подходит?

1.2 лучше не использовать - все равно придется переходить рано или поздно на 2.0, и будут проблемы с deprecated элементами - в 2.0 например по другой схеме сделаны деревья (которые виджеты), и переделывать их из 1.2 - не самое приятное занятие. Да и с unicode возникнут небольшие проблемы...

Spectr ★★★
()
Ответ на: комментарий от Spectr

Тогда уж сразу на 2.4 - внутри 2.х ветки есть устаревшие элементы, GtkCombo, например.

Begemoth ★★★★★
()

По-видимому вам нужен gtk_box_set_child_packing c expand and fill = 0. Поточнее сказать сложно, тк из месседжа ничего не понял.

geekkoo
()
Ответ на: комментарий от Begemoth

Таблицу я упомянул в варианте 2. Сомнения такие: придется учитывать размер прячущегося элемента. Ведь пока он спрятан, окно может быть таких размеров, что при его появлении будет таки растягиваться, чего совсем не хочется.

Gtk 1.2 мне нравится своей легковесностью. Но освоясь с ним, познакомлюсь и с 2.x.

Вероятно, самый оптимальный вариант - сделать так, чтобы размеры спрятанного элемента каким-то образом учитывались при размещении окна. Можно ли это как-то сделать не зная его размеров (чтобы работало для любых размеров)?

anonymous
()
Ответ на: комментарий от anonymous

In Gtk 2 there is class that hels keep ui elements in one line - GtkAlignment. I don't rememeber, possibly there was such klass in 1.2 too.

The common impresson from problem is that the incorrect desigh causes hard problems in implementation. Do you really need to hide widget, is it possible just to make them insensitive? Or try another layout with expanders. That what goes to my mind.

anonymous
()
Ответ на: комментарий от anonymous

Sorry, GtkSizeGroup. The examples of it's usage are in gtk-demo.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.