Оформление на Widgets във формуляр - QT 4 C GUI програмиране
18 QHBoxLayout *mainLayout = нов QHBoxLayout;
22 setWindowTitle(tr("Намиране на файлове или папки"));
Оформлението се предоставя от един QHBoxLayout мениджър за хоризонтално оформление, един QGridLayout мениджър за оформление на мрежови клетки и един QVBoxLayout мениджър за вертикално оформление. Мениджърът QGridLayout отляво и мениджърът QVBoxLayout отдясно са разположени един до друг във външния мениджър QHBoxLayout. Полето около диалоговия прозорец и разстоянието между дъщерните уиджети са зададени на техните стойности по подразбиране, които зависят от текущия стил на уиджета; те могат да се променят с помощта на функциите QLayout::setMargin() и QLayout::setSpacing().
Същият диалогов прозорец може да бъде създаден с помощта на инструмента за визуално създаване на Qt Designer чрез грубо позициониране на дъщерните изпълними елементи, избиране на тези, които трябва да бъдат поставени един до друг, и избиране на елементите от менюто Оформление на формуляр хоризонтално, Оформление на формуляр вертикално или Оформление на формуляр в мрежа. Използвахме този подход в глава 2, за да създадем диалоговите прозорци Go-to-Cell и Sort в приложението Spreadsheet.
Ориз. 6.3. Оформлението на диалоговия прозорец Намиране на файл.
Използването на QHBoxLayout и QVBoxLayout е доста очевидно, но QGridLayout е малко по-сложно. Мениджърът QGridLayout работи с 2D мрежа от клетки. Текстовият етикет QLabel, разположен в горния ляв ъгъл на този мениджър на оформление, има координати (0, 0), а съответният QLineEdit има координати (0, 1). QCheckBox е поставен в две колони; заема клетки с координати (2, 0) и (2, 1). Обектите QTreeWidget и QLabel под него също заемат две колони. Извикванията към функцията addWidget() имат следния формат:
layout->addWidget(джаджа, ред, колона, Редове, Колони);
Тук джаджата е дъщерна джаджа, която се вмъква в диспечера на оформлението, (ред, колона) са координатите на горната лява клетка, заета от джаджата, colRows е броят на редовете, заети от джаджата, а colColumns е броят на колоните, заети от джаджата. Ако параметрите columnRows и ColColumns не са зададени, те по подразбиране са 1.
Извикването на addStretch() казва на мениджъра на оформлението да разпредели свободно пространство в тази точка. Добавяйки разделителен елемент, ние принуждаваме мениджъра на оформлението да разпредели допълнително пространство между бутона Затваряне и бутона Помощ. В Qt Designer можем да постигнем същия ефект чрез вмъкване на разделител. Разделителите в Qt Designer се показват като сини "пружини".
В допълнение към случаите, които разгледахме досега, има допълнителни предимства от използването на мениджъри на оформление. Ако добавим джаджа към мениджъра или премахнем джаджа от него, мениджърът на оформлението автоматично ще се адаптира към новата ситуация. Същото се случва, ако извикаме hide() или show() на дъщерен уиджет. Ако идеалният размер на дъщерния модул се промени, оформлението автоматично се преустройва, за да отразява новия идеален размер. В допълнение, мениджърите на оформлението автоматично задават минималния размер на целия формуляр въз основа на минималните размери и идеалните размери на дъщерните уиджети на формуляра.
В примерите, представени досега, ние просто поставихме джаджи в мениджърите и използвахме разделители, за да разпределим допълнително пространство. Понякога това не е достатъчно, за да може оформлението да приеме желаната от нас форма. В такива ситуации можем да персонализираме оформлението, като променим политиката за оразмеряване и идеалните размери на поставените джаджи.
Политиката за размера на джаджата казва на системата за оформление как трябва да бъде разтегната или свита. Qt предоставя разумни стойности на политиката за размера по подразбиране за всички свои вградени джаджи, но тъй като нито една стойност по подразбиране не може да отчете всички възможни вариации на оформлението, все още е обичайна практика за разработчиците да променят политиката за размер на една или две джаджи за формуляри. QSizePolicy има хоризонтални и вертикални компоненти. Следните са най-полезните стойности:
• Фиксиран означава, че джаджата не може да расте или да се свива. Размерът на джаджата винаги запазва идеалния си размер;
• Минимум означава, че идеалният размер на джаджата е нейният минимален размер. Размерът на една джаджа не може да стане по-малък от идеалния си размер, но може да нарасне, колкото е необходимо, за да запълни наличното пространство;
• Максимален означава, че идеалният размер на джаджата е нейният максимален размер. Размерът на джаджа може да бъде намален до минималния идеален размер;
• Предпочитан означава, че идеалният размер на джаджата е нейният предпочитан размер, но джаджата може да се свива или разширява според нуждите;
• Разширяването означава, че джаджата може да се свива или разширява, но преди всичко има тенденция да увеличава размера си.
На фиг. Фигура 6.4 илюстрира значението на различните правила за оразмеряване, използвайки текстов етикет на QLabel с текста "Някакъв текст" като пример.
На фигурата предпочитаните и разширяващите се политики са представени по същия начин. И така, каква е тяхната разлика? Когато преоразмерявате формуляр, съдържащ и двата приспособления с правила за предпочитан и разгъващ се размер,допълнителното пространство се дава на Разширяващите се джаджи, а Предпочитаните джаджи ще продължат да имат своя идеален размер.
Ориз. 6.4. Значение на различните политики за оразмеряване.
Има още две правила за оразмеряване: MinimumExpanding и Ignored. Първото беше необходимо в някои редки случаи за по-стари версии на Qt, но вече не се използва; за предпочитане е да използвате политиката за разширяване и да замените по подходящ начин функцията minimumSizeHint(). Последното е подобно на разширяването, но игнорира идеалния размер на джаджата и минималния идеален размер.
В допълнение към хоризонталните и вертикалните компоненти на правилата за размера, класът QSizePolicy съхранява хоризонталните и вертикалните фактори на разтягане. Тези коефициенти на разтягане могат да се използват, за да покажат, че различните дъщерни модули могат да се разтягат по различен начин, когато формулярът се разшири. Например, ако QTreeWidget е позициониран над QTextEdit и искаме QTextEdit да бъде два пъти по-висок от QTreeWidget, можем да зададем коефициента на вертикално разтягане на QTextEdit на 2 и фактора на вертикално разтягане на QTreeWidget на 1.
Друг начин да повлияете на оформлението е да зададете минимален размер, максимален размер или фиксиран размер за дъщерни уиджети. Мениджърът на оформлението ще вземе предвид тези ограничения, когато подрежда джаджи. Но ако това не е достатъчно, винаги можем да подкласираме дъщерния уиджет и да заменим функцията sizeHint(), за да получим идеалния размер, от който се нуждаем.