tgoop.com/cpplastic/323
Create:
Last Update:
Last Update:
Розповім ще невеличку історію про
Отже, частиною Qt є UI-фреймворк під назвою Qt Quick. Він звісно на С++ написаний, але користувачі переважно на QML пишуть. Всі візуальні елементи там є нащадками Item. Ну й за роки розвитку він вже добряче навбирав у себе різних спільних властивостей та став дещо важкеньким.
Серед базових важливих властивостей, що були там з самого початку, є так звані anchors — механізм дуже легко робити flexible UI. Наприклад, пишете
height: 35
anchors.bottom: parent.bottom
і поточний елемент завжди буде 35 пікселів заввишки і завжди прикріплений до нижнього краю контейнера, в якому лежить. Виглядає, як якась потойбічна магія для тих, хто пише на CSS, я розумію.
Хоч на анкорах майже будь-що можна зробити, та не завжди це зручно. Якихось більш високорівневих лейаутів не було, й згодом їх додали окремим модулем
QtQuick.Layouts. Відтоді стало можна писати якось отак:RowLayout {
TextField { Layout.fillWidth: true }
Button { text: 'Submit' }
}Ця штука автоматично позиціює елементи в рядок. Причому поле для вводу текста розтягнеться на всю можливу ширину, а кнопка буде мінімально можливого для себе розміру. Доволі зручно, хоча в певних випадках вкрай важко змусити ці лейаути робити те, що тобі треба, бо вони переускладнені відчутно. Не flexbox, звісно, але у мене в голові червона лампочка складності вже мерехтить.
Та весь кайф був у тому, що ніхто
QtQuick.Layouts не навʼязував. Не подобається, як вони працюють? То напиши свій (на C++)! Так і зробив мій друган, що тоді був девелопером у моїй команді. І тепер його лейаут «катається» у сотнях тисяч Мерседесів з MBUX.Та, схоже, не всім це було до душі. Виявилося, що комусь занадто складно розставляти
fillWidth/fillHeight у потрібних місцях 🤦🏻♂️ Це, як на мій погляд, не велика проблема, бо QML дозволяє це суперлегко вирішити створенням нових компонентів. Для цього треба або новий файл створити (1 компонент = 1 файл), або прям inline написати на кшталт:component FormField: TextField {
Layout.fillWidth: true
}
RowLayout {
FormField {}
Button {}
}Ну, типу… все! Що може бути краще?
Але якийсь черговий геній в Qt знайшов можливість «пакращєння»:
1) він додав у базовий
Item властивість sizePolicy, яка має вказувати кьютовому лейауту, чи розтягувати елемент, чи він мусить мати фіксований розмір. 2) Потім він нахуєвертив «sensible defaults» в усі контроли, що наслідують
Item, тобто всі кнопки, текст-філди, слайдери й таке інше. 3) Ці sensible(!) defaults миттєво наламали KDE Plasma, де все поплило, бо не такі вони й sensible виявилося.
4) І на додачу,
sizePolicy ще й частина private API, тобто для своїх кастомних лейаутів це буде проблематично використати. Отже, QtQuick.Layout тепер прибитий цвяхами до QtQuick.Наразі вирішили цю фічу зробити тимчасово opt in, однак, проперті вже там, тож кожен Item позаяк займає більше памʼяті, ніж раніше.
А які задачі ви вигадуєте собі на роботі, щоб не складалося враження, що сидите без діла?
