Мои мучения с Qt
2021-11-08 14:41Понадобилось мне по работе сваять простой плеер мультиков. То есть утилитку с графическим интерфейсом, показывающую выполнение некого вычислительного процесса на хитром матричном процессоре. Выглядит как мультик: данные бегают туда-сюда, умножители пыхтят. Как делать понятно, но надо подобрать, на чём делать. Пошёл я искать, какие нынче фреймворки в ходу, и оказалось непросто.
Работать должно на маке, линуксе и виндоуз, как обычно принято. Должен быть родной бинарный код для каждой платформы, а не виртуальные машины. Ну и размер приложения чтобы не зашкаливал. Ещё один критерий: язык лучше Rust, а не Си++, по возможности. Накушались уже этого Си++, всё с ним понятно, пора начинать переходить на более развитые вещи.
По старой памяти, стал я смотреть Qt, Gtk, Wx и другие известные библиотеки. У всех у них есть даже кое-какая привязка к Rust. Но Wx давно отстал от жизни, Gtk нормально фурычит только на линуксе, остался один Qt. И выяснились с ним серьёзные проблемы.
spamsink попробовал я CopperSpice. Тут хотя бы не надо подписку платить. Но опять же LGPL, то есть 200 мегабайт бинарников вынь да положь. И главная проблема: недостаточная поддержка. Из готовых пакетов не поставишь: ни на Убунту, ни на маке CopperSpice нету в пакетах. Собрать на маке не удалось: неопределённые темплейты и классы где-то в cs_string.h. Явная несовместимость с последней версией Apple SDK12.0. На линуксе собралось, но не запускается:
Вообще этот CopperSpice (да и Qt) - махина жуткого размера. Компиляция занимает несколько часов на не самой слабой машине. Для небольшого приложения явный перебор.
В общем, пока я остановился на Iced. Делает ровно то, что нужно, и приложения имеют разумный размер в пределах 4-7 мегабайт, без больших зависимостей.
Работать должно на маке, линуксе и виндоуз, как обычно принято. Должен быть родной бинарный код для каждой платформы, а не виртуальные машины. Ну и размер приложения чтобы не зашкаливал. Ещё один критерий: язык лучше Rust, а не Си++, по возможности. Накушались уже этого Си++, всё с ним понятно, пора начинать переходить на более развитые вещи.
По старой памяти, стал я смотреть Qt, Gtk, Wx и другие известные библиотеки. У всех у них есть даже кое-какая привязка к Rust. Но Wx давно отстал от жизни, Gtk нормально фурычит только на линуксе, остался один Qt. И выяснились с ним серьёзные проблемы.
- Qt больше не свободный софт. Мало того, для коммерческого применения его нельзя купить один раз и всю жизнь использовать, как раньше. Надо платить подписку каждый год, на каждого программиста в команде. Перестал платить - не можешь больше продавать свой софт на базе Qt.
- Можно юзать Qt с лицензией LGPL, не все компоненты, но основные. Но только с разделяемыми библиотеками. Никакой статической линковки. Это означает, что вместе с кодом своего приложения (обычно пара мегабайт) надо выдавать юзеру 200 мегабайт бинарников библиотек Qt. Как-то несоразмерно.
- Для Rust есть привязка к Qt, и на первый взгляд оно работает, я даже переписал пример простого текстового редактора с Си++ на Rust+Qt. Но при ближайшем рассмотрении возникают большие проблемы. Порождение новых элементов графического интерфейса в Qt делается через наследование классов Си++. Отлично работает, но... в языке Rust нет наследования. Серьёзная часть базовой функциональности недоступна.
The application failed to start because the platform plugin was not found or did not load.Бился-бился, да так и бросил.
Requested Plugin Key: "xcb"
Вообще этот CopperSpice (да и Qt) - махина жуткого размера. Компиляция занимает несколько часов на не самой слабой машине. Для небольшого приложения явный перебор.
В общем, пока я остановился на Iced. Делает ровно то, что нужно, и приложения имеют разумный размер в пределах 4-7 мегабайт, без больших зависимостей.

no subject
Date: 2021-11-08 23:46 (UTC)no subject
Date: 2021-11-09 00:06 (UTC)no subject
Date: 2021-11-09 07:31 (UTC)no subject
Date: 2021-11-09 00:07 (UTC)no subject
Date: 2021-11-09 00:23 (UTC)no subject
Date: 2021-11-09 00:35 (UTC)если нет предубеждений против .NET
no subject
Date: 2021-11-09 00:59 (UTC)На первый взгляд, выглядит отлично.
"Inspired by Elm programming language" - это, вообще, практически лучшее, что бывает в области интерфейсов... Permissive license, как и должно быть.
no subject
Date: 2021-11-09 01:23 (UTC)no subject
Date: 2021-11-09 01:45 (UTC)no subject
Date: 2021-11-09 05:25 (UTC)no subject
Date: 2021-11-09 07:02 (UTC)no subject
Date: 2021-11-09 07:39 (UTC)хотя можно надёргать динамических библиотек через какой-нть тул и не тащить всю кучу, ну и компиляция там через обычные компайлеры, не должно быть долго по идее
имко наследование и нужно только для того чтобы затачивать библиотечные классы под свой размерчег, к сожалению в крестах его вкрячили под всё что под руку попало и через какое-то время любой большой проект превращается в ковыряние генеалогического дерева габсбургов в попытках понять откуда что повылазило
no subject
Date: 2021-11-09 07:54 (UTC)no subject
Date: 2021-11-09 09:08 (UTC)no subject
Date: 2021-11-09 10:04 (UTC)no subject
Date: 2021-11-09 15:37 (UTC)Я, когда читал про отсутствие статических библиотек в qt, решил, что лицензия на программиста нужна на время разработки.
А, оказывается, "пожизненно".
no subject
Date: 2021-11-21 11:15 (UTC)Интересно, использование таких билдеров:
Row::new() .spacing(20) .align_items(Alignment::Center) .push(checkbox) .push( Button::new(edit_button, edit_icon()) .on_press(TaskMessage::Edit) .padding(10) .style(style::Button::Icon), ) .into()Приводит ли к тому что Rust на этапе компиляции преобразует это в команды отрисовщика, которые будут вызываться только тогда, когда этот элемент будет перерисовываться? Таким образом переложив заботу отрисовки на клиента, а не систему. (позволив избежать построения динамических структур внутри библиотеки/системы) Мне кажется в теории, это более эффективно должно быть.
Для веба там еще заявлена отрисовка через WebGPU API 😮