Qt для початківців

Князєв Олексій Олександрович. Незалежний програміст та консультант.

Qt для початківців. Урок 2. Менеджери компонування. Знайомство

Повернутися до загального змісту Qt для початківців.

Способи розміщення віджетів

У еволюції ідей розміщення елементів управління на віконних формах можна назвати три підходи.

Залежно від правил роботи компонувальника та політики зміни розмірів віджетів, при зміні розмірів базового віджету, проводиться автоматичний перерахунок розмірів віджетів, покладених у комірки компонувальника. Існує безліч різних моделей компонувальників у кожній із бібліотек, де вони використовуються. У комірки компонувальників можна вкладати не тільки віджети, але й інші компонувальники, в результаті чого можна придумати складні структури, що розтягуються. Крім створення складних компунувальних структур, можна керувати політиками розтягування віджетів, які укладаються в комірки компонувальників. Таким чином, відкриваються дуже широкі можливості для створення форм різної складності і поведінки, що розтягуються.До недоліківтакого способу розміщення об'єктів можна віднести лише деяку складність використання компонувальників, особливо на початковому етапі знайомства з ними. На деяку радість можна помітити, що система менеджерів компонування, яка використовується в бібліотеці Qt, набагато простіше, ніж система менеджерів компонування, яка використовується в бібліотеці Java SWING, при тому, що можливості, за винятком деяких ідей і деталей, практично однакові.

Бібліотека Qt підтримує два способи розміщення елементів керування. Координатне, приклад якого був показаний наприкінці минулого уроку, та розміщення з використанням менеджерів компонування.

Прикладивикористання менеджерів компонування

Нижче буде наведено кілька прикладів роботи з менеджерами компонування на основі повторення того шаблону, що було зроблено за допомогою майстра створення проекту на першому уроці.

Щоб розуміти роботу менеджерів компонування, потрібно знати наступне.

  1. Ланцюги володіння компонувальників реалізовані так, що володіти компонувальником може лише компонувальник.
  2. Кожен елемент, який успадковується від класу QW &setsetLayout(), тобто. встановити себе компонувальником зазначеного віджету.
  3. Коли один менеджер компонування (первинний) включає в свій осередок інший менеджер компонування (вторинний), то вторинний компонувальник створюється без вказівкиparent, так як віджет може бути тільки один менеджер компонування. Володіння вторинним компонувальником створюється автоматично при додаванні вторинного компонувальника в комірку первинного компонувальника. Таким чином, первинний компонувальник володітиме вторинним і буде відповідальним за його видалення. метод компонувальниківaddLayout().
  4. У комірки менеджерів компонування можна встановити або віджет, або вторинний менеджер компонування. І тому існують методиaddWidget()іaddLayout()відповідно. При додаванні вторинного компонувальника, як говорилося, він входить у ланцюг володіння первинного компоновщика. При додаванні віджету він включається в ланцюг володіння віджету, якому належить ланцюг компонувальників тільки в тому випадку, якщо для нього не був раніше заданий власник. Така поведінка не характерна для старих версій Qt, тому ще існують традиції, які задають ланцюги володіння для віджетів, які встановлюються в комірки менеджерів компонувальники.

Таким чином, якщо розглядати код із боку деякогоВіджета, щоб "натягнути" менеджер компонування на поточний віджет (this), можна використовувати один з наступних варіантів запису. Напишемо приклади для класу QGridLayout.

Перший варіант (явне використанняsetLayout())

Другий варіант (неявне використанняsetLayout())

Якщо об'єкт менеджера вирівнювання створюється без передачі в його конструктор значенняparent(тобто буде використовуватися значення за замовчуванням - 0), то це означає або те, що об'єкт менеджера компонування буде пов'язаний з віджетом власником пізніше ( через явний виклик setLayout()), або це означає, що даний об'єкт менеджера компонування є вторинним і буде встановлений в якусь комірку іншого менеджера.

Всі приклади ми будуватимемо однаковим чином, на основі визначення приватного методуcreateFormInterior(). Традиційно, ми будемо використовувати цей метод для створення інтер'єру форм. Оголошення методу проводиться у заголовному файлі форми в такий спосіб. Наведемо змінений стан файлуwidget.h.

Виклик методу створення інтер'єру форми повинен проводитись у конструкторі класу форми. Наведемо змінений стан файлуwidget.cppіз заготівлею методуcreateFormInterior().

Всі наведені нижче приклади будуть використовувати цю заготівлю, тому далі ми будемо публікувати тільки список заголовних файлів і код методуcreateFormInterior().

Приклад роботи з менеджером компонування QGridLayout

Клас менеджера компонуванняQGridLayoutреалізує сіткове компонування в комірки якого можна вставляти віджети та будь-які інші менеджери компонування. Осередки можна об'єднувати як по сусідніх стовпцях, так і по сусідніх рядках, утворюючи нерегулярнуструктури сітки. При цьому розміри ширини кожного стовпця сітки та висота кожного рядка сітки можуть бути різними і визначаються за сукупністю політик зміни розмірів віджетів, розміщених у осередках сітки.

Сіткова модель компонування рідко використовується як основний менеджер вирівнювання форми. Причина цього стане зрозумілою при отриманні деякого досвіду роботи з компонувальниками. Однак він ідеально підходить для компонування деяких ділянок форми, наприклад, вертикальних списків з пар QLabel - QLineEdit.

Перейдемо до прикладу. На початок файлуwidget.cвставимо наступні рядки для включення заголовних файлів на необхідні класи Qt.

Далі додамо реалізацію методу створення інтер'єру,createFormInterior().

У рядку 03 створюється об'єкт менеджер компонування класуQGridLayout. Менеджер компонування неявно (через параметр конструктора) встановлюється в поточний віджет.

Далі створюється ряд об'єктів віджетів, які встановлюються в комірки створеного об'єкта менеджера компонування. При цьому використовуються два перевантажені методи додавання віджетів.

    vo >Пояснимо значення параметрів, що передаються в ці методи.

    QW >Код зі створення та включення кожного з віджетів в менеджер компонування укладено в окремі операторні дужки < … >. Це дозволяє максимально звужувати область видимості імен об'єктів, що створюються. При досягненні завершальної дужки, створені в дужках змінні-покажчики будуть знищені і засмічувати простір імен подальшого коду методу. По-перше, це дозволяє багаторазово використовувати прості імена для створення об'єктів. По-друге — позбавляє нас від можливих помилок неправильного використання імен, наприклад, принекоректне повторення схожих фрагментів коду. Іншими словами, такий підхід максимально відповідає правилу про те, що об'єкт повинен бути описаний та використаний лише там, де він використовується. Мова C++ дозволяє легко дотримуватися цього правила. На швидкість роботи результуючого коду така локалізація об'єктів не вплине, а читабельність та надійність коду зросте.

Ми розібрали приклад із використанням класу менеджера компонуванняQGridLayout. Досягніть компіляції і запуску прикладу. Подивіться як перебудовуватимуться віджети у формі при зміні розмірів форми. Згадайте як встановити мінімальний розмір форми і задайте його так, щоб не допускати спотворення віджетів. Спробуйте створити власні проекти з використанням розглянутого менеджера компонування. Використовуючи довідковий посібник з Qt розширюйте знайомство з віджетами встановлюючи їх у комірки компонувальника.