Qt designer
Содержание:
Изменения в коммерческом лицензировании
Коммерческое лицензионное соглашение обновилось до версии 4.1. Добавился аппендикс с перечислением лицензируемого/распространяемого ПО.
Значительно улучшились условия лицензии для стартапов: во-первых, она теперь не со скидкой, а вообще бесплатная, а во-вторых, теперь доступны компоненты и из Device Creation тоже (готовые образы на основе Yocto Linux, тулчейны для кросс-компиляции и т.д.), однако для распространения продуктов-устройств рантаймы покупать всё равно потребуется (логика такая, что если есть деньги на железо, то должны найтись и на рантаймы).
Лицензия для стартапов выдаётся на год и потом может быть продлена ещё на год. Юридически это полноценная коммерческая лицензия без необходимости выполнять требования GPL/LGPL. После первого года (или двух) она превращается в обычную лицензию за полную стоимость.
У стартапных лицензий действуют следующие ограничения:
- годовой доход компании должен быть меньше 100 000 долларов, иначе вы не квалифицируетесь как стартап;
- получить лицензии можно максимум на 3 разработчиков;
- техническая поддержка сильно урезана: 5 тикетов в месяц и низкий приоритет в очереди.
Кстати, не исключено, что вашу заявку на стартапную лицензию будет рассматривать как раз девушка с обложки статьи.
Улучшения в QBS
- Добавлена поддержка этих новых компиляторов и реализована возможность автоматического определения установленных компиляторов и создания профилей.
Свойство qbs.architecture имеет следующие значения:Имя архитектуры Значение свойства STM8 stm8 MSP430 msp430 - Добавлена поддержка генераторов в проекты Keil MDK и IAR EW для следующих архитектур и версий:
IDE Архитектура Генератор KEIL uVision 5.23 ARM keiluv5 KEIL uVision 5.23 MCS51 keiluv5 IAR EW 8.40.1 ARM iarew8 IAR EW 3.11.1 STM8 iarew3 IAR EW 10.10.1 MCS51 iarew10 IAR EW 7.12.4 MSP430 iarew7 IAR EW 7.20.1 AVR iarew7 Примечание: В таблице выше представлены версии продуктов с которыми шла разработка генераторов и более-менее проверялась работоспособность.
Таким образом, теперь можно этими генераторами создать нативный проект для желаемой целевой IDE. При этом, каждый генератор будет преобразовывать все компилятор-специфические флаги, пути, зависимоси, заданные в QBS проекте в соответствующие настройки целевого IDE проекта.
Если исходный QBS проект содержал несколько продуктов (например, приложения, библиотеки и пр.), то генератор создаст целевой «workspace» с вложенными под-проектами «project» для каждого целевого IDE. Примечание: Сразу оговорюсь, что, как я знаю, IDE от KEIL или IAR EW не поддерживают отслеживание зависимостей (если я не прав — поправьте). Поэтому, например, если проект содержит приложение и зависимость в виде библиотеки, то пользователю нужно будет сначала собрать библиотеку, а потом уже само приложение.
Для генерации проектов необходимо иметь уже настроенные профили QBS с соответствующими компиляторами. Примечание: Пока что без профилей не обойтись, т.к. генератор из профиля получает саму архитектуру, пути к пред-установленному компилятору (IDE) и прочее. Эти данные нужны для корректного поиска скриптов линковщика, путей к runtime библиотекам и прочих специфических вещей (там не простая логика).
Например, чтобы создать целевой проект для IAR EW и ARM микроконтроллера, достаточно выполнить следующую команду:
Имена профилей можно получить используя, к примеру, GUI утилиту qbs-config-ui (или использовать консольный вариант).Примечание: На данный момент, генераторы имеют экспериментальный статус. Возможно, в некоторых случаях (если исходный проект сложный) они будут генерировать некорректные целевые файлы проектов, или пропускать некоторые флаги и прочее. Сильно не ругайте, а создавайте баг-репорты в QBS трекере.
здесьздесьпримеров
Новые релизы
Qt 5.11
22 мая вышел Qt 5.11.
Не могу выделить какие-то особо значительные нововведения, кроме переработанного процесса компиляции QML, который должен существенно улучшить производительность Qt Quick приложений:
Также в релизе:
- поддержка High-DPI для Qt Widgets на Windows (до этого было только в Mac OS и Linux);
- поддержка сжатых текстур в Qt Quick;
- превью реализации коммуникационного протокола OPC UA;
- превью Qt for WebAssembly.
Но зачем.
Qt 5.12
6 декабря вышел Qt 5.12 (обзор от CTO), очередной LTS релиз, который будет поддерживаться 3 года.
Улучшена производительность. В основном это касается движка QML и JavaScript, который теперь соответствует стандарту ECMAScript 7.
Релиз Qt Remote Object — механизма межпроцессорного взаимодействия как на одном хосте, так и между разными хостами по сети.
Релиз Qt Quick WebGL, он же Qt WebGL streaming — то есть возможность транслировать GUI приложения, работающего на удалённом хосте (устройстве без дисплея), и отображать его в браузере на десктопе или планшете. Как пример — Raspberry Pi с камерой, Qt-приложение стримит GUI вместе с выводом камеры, а рендерится всё в обычном Safari на iPad:
Очень прикольная штука, я прямо восторгом с ней поигрался, но откровенно говоря я не представляю, кто и зачем будет этим пользоваться. Если и так подразумевается работа с девайсом из браузера, то зачем городить GUI на Qt Quick и стримить его в WebGL? Не проще ли тогда просто запустить на девайсе нормальный веб-сервер, а GUI на клиенте будет с HTML/CSS/JS без вот этого всего? Странная фича, в общем.
В Qt Quick Controls 2 наконец-то добавили TableView. Вот даже сравнение производительности аналога из Qt Quick Controls 1. К сожалению, по-прежнему никаких новостей про TreeView.
Pointer Handlers вышли из статуса превью и переименовались в Input Handlers. Это новый модуль для обработки ввода с мыши, клавиатуры и тачскрина. В связи с этим в какой-то момент следует ожидать «устаревания» MouseArea.
В Qt Virtual Keyboard помимо прочего добавлены новые языки а также новый движок рукописного ввода — MyScript.
В Qt for Device Creation появились так называемые Qt Board Support Packages. Это те же самые Yocto образы и тулчейны, только теперь в виде отдельно загружаемых и подключаемых к установщику пакетов. Смысл QBSP заключается в поддержке партнёров-вендоров железа, чтобы им было удобнее создавать и распространять Boot to Qt образы для своих устройств.
Развивается поддержка Wayland.
Другие новости
В этом году Qt World Summit прошёл два раза: Бостоне и потом в Берлине. Записей выступлений пока нет, есть только короткий видео-обзор берлинского и пост от KDAB.
Грядёт обновление иконок приложений:
Как вам? Мне тоже. А главное, откуда опять эта нужда в редизайне, не так давно был уже один, и довольно неплохой.
Компания Forrester провела исследование, в котором изучила влияние Qt на бизнес, всякие там ROI показатели и прочее. Вроде как это должно помочь компаниям оценить пользу от Qt и принять решение о приобретении коммерческой лицензии. Есть даже онлайн-калькулятор для подсчёта сэкономленных попугаев.
На этом с новостями пока всё, следующий выпуск будет где-нибудь в мае или как наберётся достаточно материала.
Анонс Kuesa
Говоря о 3D, тут KDAB выпустили своё решение для работы с 3D — Kuesa.
В отличие от Qt 3D Studio, они не стали тратить ресурсы на собственный инструмент для 3D моделирования, а позволяют дизайнерам работать с их привычными инструментами (3DS Max, Blender), и далее разработчик может использовать экспортированные glTF модели в Qt. Для удобства в наличии также есть приложение для предпросмотра модели и наименований компонентов, чтобы разработчик знал как к ним обращаться у себя в коде, не открывая модель в оригинальном 3D редакторе.
На мой взгляд Kuesa является конкурирующим Qt 3D Studio решением (и судя по всему, более удачным), и это досадно, потому что вместо того, чтобы параллельно заниматься одним и тем же, эти усилия можно было бы потратить на что-то более полезное (я сейчас не обязательно про KDAB). Тут кстати будет напомнить что сам Qt 3D это тоже вклад KDAB.
Что такое Qt?
Возможно, это самый всеобъемлющий C++ фреймворк. Но это не только фреймворк, это также разнообразные инструменты, которые помогают разрабатывать embedded-устройства, UI-технология Qt Quick, не относящаяся к C++, но интегрируемая с ним.
Две лицензии: коммерческая и LGPLv3/GPLv3. Это открытый проект.
Два продукта:
- Qt for Application Development (Desktop & Mobile Platforms: Android, Linux, Windows, Mac, iOS)
- Qt for Device Creation (Embedded platforms: Android, Linux, Windows,QNX, VxWorks, Green Hills Software (IOT, интернет вещей))
Qt for Application Development
В основе находятся неотъемлемые библиотеки. Самая главная — Core, содержащая основные классы, I/O, работу с файлами и т.д. Библиотека GUI — основа графического интерфейса. И много других.
Qt Creator
Кроссплатформенная среда разработки для настольных, мобильных и встраиваемых систем. Многие используют ее для программирования на чистом C++, без Qt. Поддерживает интеграцию различных инструментов (профилировщики, отладчики…), автокомплит, VCS…
Раннее обнаружение ошибок с помощью Qt Creator и CLang static analyzer
Обновления инструментов
Qt Creator
За полгода вышло две версии Qt Creator: 4.7 и 4.8.
Из наиболее значимых нововведений — поддержка Language Server Protocol, то есть возможность расширения Qt Creator для работы с большим количеством языков программирования. В то же время, «родной» QML до сих пор не в курсе последних версий модулей для импорта, из-за чего их приходится перебирать научным тыком.
В версии 4.8 также должен был быть добавлен модуль телеметрии, но в этот релиз он не попал, так что ожидайте в 4.9.
Qt Design Studio
Тот самый :
- анонс;
- релиз.
Как вы знаете, в составе Qt есть прекрасный инструмент для создания GUI на Widgets — Qt Designer. С ним можно работать как из Qt Creator (вкладка Design), так и запустив его как самостоятельное приложение для работы с файлами.
С появлением Qt Quick добавился инструмент Qt Quick Designer, который уже нельзя запустить как отдельное приложение, так как он насмерть прибит гвоздями к Qt Creator.
И вот Qt Design Studio — это тот же самый Qt Quick Designer, но с дополнительным функционалом. Также это теперь самостоятельное приложение, хотя по факту это просто покалеченная копия Qt Creator, которая запускается сразу в режиме дизайна Qt Quick (с возможностью переключения в режим редактирования QML).
- рекламный ролик;
- краткий обзор;
- пример работы с проектом.
Из нового функционала: линия времени для работы с анимациями, удобные диалоги для настройки этих анимаций и компонент live-preview для предпросмотра изменений на лету как в отдельном окне, так и на присоединённом планшете или другом устройстве. Примечательно, что все эти вещи вряд ли когда-нибудь попадут обратно в Qt Quick Designer.
Qt Design Studio предназначена для дизайнеров, и подразумевается, что они будут создавать в ней дизайн приложения, передавать результат ( файлы) разработчикам, а разработчики будут работать с ними в полноценном Qt Creator.
Также ведётся разработка плагинов для существующих популярных инструментов дизайна, чтобы дизайнеры могли экспортировать свои наработки из этих инструментов в QML. Первым был создан плагин для Adobe Photoshop, следующим ожидается плагин для Sketch, затем Adobe XD и другие.
Я не дизайнер, потому мне сложно оценить полезность Qt Design Studio. Когда в Qt были только Widgets, я с плохо скрываемым удовольствием работал в Qt Designer, это отличный инструмент для создания GUI и по сей день. Когда появился Qt Quick, я несколько раз пытался пользоваться Qt Quick Designer, но в итоге бросил и просто пишу QML, для меня так удобнее и быстрее. А так как Qt Design Studio это почти что и есть Qt Quick Designer, то лично я ей пользоваться буду вряд ли. В то же время, насколько мне известно, ряд дизайнерских агентств, которые получили Qt Design Studio на «тест-драйв», отзываются о ней положительно.
В плане лицензирования инструмент вроде как заявлен в Open Source (GPLv3), но в то же время вроде как для распространения результатов работы требуется коммерческая лицензия. Да и просто загрузить установщик не так-то просто, требуется наличие Qt Account. В общем, менеджеры продукта пока ещё не совсем определились.
Qt 3D Studio
Продолжается развитие Qt 3D Studio. За это время вышли версии 2.0 (более подробный обзор), 2.1 и 2.2.
Наиболее значительно изменение — переход с движка оригинальной NVIDIA DRIVE Design Studio на собственный движок на основе Qt 3D и значительное улучшение производительности.
Также был обозначен план объединения Qt 3D Studio и Qt Design Studio в единый инструмент, то есть вместо двух это будет одно приложение для работы с 2D и 3D.
Отказ от Qbs
Топ 10 предательств в аниме! Вероломно, без объявления войны, в официальном блоге было заявлено об отказе от Qbs.
Вкратце: разработка Qbs прекращается, хотя и будет выпущен ещё один релиз, поддержка закончится в конце 2019 года, qmake пока останется, но в перспективе (Qt 6) будет осуществлён переход на CMake как основную систему сборки.
Пост собрал две сотни комментариев (рекорд для нашего блога), и собрал бы больше, но комментарии к постам автоматически закрываются через две недели после публикации. Вот тут ещё есть комментарии на русском.
Опуская техническое обоснование решения, основное возмущение вызвал тот факт, что несколько лет сообществу твердили о том как Qbs прекрасен и какой это шаг вперёд, не говоря уже о заверениях что это будет официальная система сборки в Qt 6 и всем надо на неё переходить (и народ таки начал переходить), и тут вдруг Qbs закрывается таким стремительным домкратом.
Вопросы и ответы
Конечно мы работаем над этим, тратим много времени, выпускаем патчи, апдейты. Наш security mailing list достаточно небольшой.
Хороший вопрос! В нашей компании и в тех которые работают с нами используется «кьЮт», хотя в США преимущественно «кьютИ».
В идеале да, но есть проблемы. Во-первых, из-за поддержки старого кода. Во-вторых, некоторые Qt классы лучше, например QString (интерфейсные методы типа преобразования регистра, юникод). Задают много вопросов про схожие контейнеры. Я советую выбирать наиболее подходящие.
Это очень сложно. И сломается весь старый код.
От продаж коммерческой версии.
Все сломается. Если бы мы предвидели появление семантику перемещения, то возможно не стали бы использовать текущий механизм. Сейчас его менять нереально.
Для коротких строк копирование быстрее. Скоро выйдет обновление, в котором будет реализован подобный механизм для коротких строк.
Using the Qt static environment
Command line
This section describes how to use the static Qt environment from the command line, either the traditional Windows command shell (cmd.exe) or the Windows PowerShell.
Simply add the bin subdirectory of the static Qt environment in front of the Path environment variable. For Qt 5.5.0, this is C:\Qt\Static\5.5.0\bin.
Do not forget to also include the MinGW environment in the path. With the dynamic pre-built Qt environment, you may want to add Qt Creator also.
The following commands summarize the command line setups for the various environments.
Dynamic pre-built Qt with the traditional Windows command shell:
set Path=C\Qt\Qt5.5.0\5.5.0\mingw492_32\bin;C\Qt\Qt5.5.0\Tools\mingw492_32\bin;C\Qt\Qt5.5.0\Tools\QtCreator\bin;C32;C
Dynamic pre-built Qt with the Windows PowerShell:
$envPath=C\Qt\5.5.0\5.5.0\mingw492_32\bin;C\Qt\Qt5.5.0\Tools\mingw492_32\bin;C\Qt\5.5.0\Tools\QtCreator\bin;C\32;C
Static Qt build with the traditional Windows command shell:
set Path=C\2.0\bin;C\Qt\Qt5.5.0\Tools\mingw492_32\bin;C\32;C
Static Qt build with the Windows PowerShell:
$envPath=C\Qt\.5.0\bin;C\Qt\Qt5.5.0\Tools\mingw492_32\bin;C\32;C
Using the Qt static environment with Qt Creator
This section describes how to use the static Qt environment from Qt Creator. Note that Qt Creator itself is part of the dynamic pre-built environment. By default, it builds the applications for this dynamic environment. But it is possible to configure it to additionally use the static Qt environment.
The following description is based on a Qt 5.5.0 / Qt Creator 3.4.2 installation, without additional customization of Qt Creator. Change the version numbers to adapt to your configuration.
Qt Creator setup
Open the Qt Creator options edit box (menu «Tools» then «Options…»). Select «Build & Run».
Go to tab «Qt Versions». In the «qmake location» table, there must be an «Auto-detected» part and a «Manual» part. In the «Auto-detected» part, there should be one line named «Qt 5.5.0 MinGW 32bit C:\Qt\Qt5.5.0\5.5\mingw492_32\bin\qmake.exe». The «Manual» part is initially empty.
Click «Add», browse to C:\Qt\Qt5.5.0\bin and select «qmake.exe». The version name is automatically set to «Qt 5.5.0 (5.5.0)». You should set a more meaningful name such as «Qt 5.5.0 MinGW Static 32bit»
Then go to tab «Kits». Again, there must be an «Auto-detected» part and an initially empty «Manual» part. Click «Add». Set a meaningful name such as «Desktop Qt 5.5.0 MinGW Static 32bit». In the «Qt version» field, select your static environment, named «Qt 5.5.0 MinGW Static 32bit» if you followed the above advice.
Then click «OK» to terminate the options setup.
Project setup
In each project you want to deploy with a static build, edit the project setup (select «Projects» in the left vertical pane).
Click «Add Kit» in the upper left corner and select your static kit, named «Desktop Qt 5.5.0 MinGW Static 32bit» if you followed the above advice.
The new kit for your project is configured. Note that, by default, there are distinct build directories for the dynamic and static versions of your project.
Now you can build your application in any combination of static vs. dynamic and release vs. debug. In the bottom part of the left pane, the project selector (the computer icon with the name of your project and either «Release» or «Debug») lets you select the combination you want.
Note that it is recommended to build only release versions of the application with the static environment. Avoid building a debug version of the application with the static environment. There are several reasons for that:
Building the Qt static environment
Download and run, all done
Prior to executing this script, you may have to make one or two changes:
- The path that reads » C:\Qt\*\Tools\mingw*\bin\gcc.exe» needed to be changed to » C:\Qt\Tools\mingw*\bin\gcc.exe» on my (Windows 10) system.
Execute the script.
The windows-build-qt-static.ps1 script can be directly invoked from the Windows Explorer if you are ok with the default parameter values (see below). If you are not familiar with PowerShell, simply right-click on the file and select «Run with PowerShell».
The script performs the following steps:
- Download Qt source code.
- Build a static version of Qt using the MinGW compiler in the pre-built dynamic environment. It builds the libraries and the command line tools (qmake, moc, uic, lupdate, lrelease, etc.)
- Install the static version of Qt in C:\Qt\Static by default.
The execution of this script may take a couple of hours to complete, depending on your processing power. So you have to be patient. Qt is a complex framework with a very large amount of code.
Command line syntax
Alternatively, you can invoke the script from the PowerShell prompt using the following syntax:
windows-build-qt-static.ps1 [-QtSrcUrl url] [-QtStaticDir directory] [-QtVersion string] [-MingwDir directory]
Command line parameters
-QtSrcUrl url
Instead of using the parameter on the command line, you may want to modify the default value in the script using another URL / version. Update the following line:
$QtSrcUrl = "http://download.qt-project.org/official_releases/qt/5.5/5.5.0/single/qt-everywhere-opensource-src-5.5.0.7z",
-QtStaticDir directory
Specify the root directory where the static versions of Qt are installed. By default: C:.
-QtVersion string
Specify the Qt version. By default, the script tries to extract the version number from the Qt source file name. Usually, this is sufficient, the script will find «5.5.0» or «5.0.0-rc1» for instance. If the naming scheme of the Qt source file changes one day, you may need to specify an explicit value to this parameter.
-MingwDir directory
Specify the root directory of the MinGW environment. By default, use the version which was installed by the prebuilt Qt environment.
When the prebuilt environment for Qt 5.5.0 is installed for instance, the script locates MinGW in C:\5.5.0\Tools\mingw492_32. If you chose not to install MinGW as part of the prebuilt environment for Qt, you have to specify the root directory of your MinGW installation.
-NoPause
Do not wait for the user to press enter at the end of execution. By default, the scripts executes a pause instruction at the end of execution, which is useful when the script was run from the Windows Explorer.
Qt сейчас
Наши цели:
- Поддержка старого кода
- Интуитивность
- Самодокументированность
- API, простое для изучения и использования
- Производительность
Сохранение простоты
C++ имеет очень крутую кривую обучения, из-за чего новичкам бывает тяжело. Вся эта сложность требуется в редких случаях. А Qt пользуются не только гуру C++. Вы редко увидите разработчика приложений возящегося с шаблонным метапрограммированием.
Реализация
[Поверхностно рассказывается про основы QObject, Сигналы/Слоты, moc, про которые написано в любом руководстве, пропустил]
Подробнее: Implicitly shared
Многие классы реализованы примерно так:
Это позволило нам быть более свободными при добавлении и удалении членов класса. При изменении объекта создается копия внутренних данных. Достоинства такого подхода:
- Объекты ведут себя почти как примитивные типы
- Простое и быстрое копирование объекта
- Объект может быть передан по значению
- Потокобезопасно
Недостатки:
- Небольшое ухудшение производительности из-за атомарного счетчика
- Небольшое изменение семантики итерирования
- У Range-for циклов могут быть проблемы:
Заполнение недостающего в стандартной библиотеке:
- QString с поддержкой юникода, который C++ нормально не поддерживает.
- QLocale
- QDate/QTime/QDateTime/QTimeZone
- QAtomic и потоки. Реализованы до C++11
- Работа с файловой системой, I/O, сетью
- Графика
Релиз PySide2 / Qt for Python
PySide вернулся, переименовался сначала в PySide2, а потом в скучный Qt for Python.
Первый релиз вышел с Qt 5.11, но он всё ещё не считался за полноценный, а вот буквально на днях выпустили уже официальный релиз вместе с Qt 5.12.
Вряд ли я могу рассказать здесь что-то новое. Как и раньше, PySide — это возможность использовать Qt (в основном, для GUI) из Python. Распространяется через PyPI, то есть в состав официального установщика Qt не входит, и устанавливается отдельно через . Поддержка на embedded платформах пока отсутствует, хотя и запланирована.
Списка отличий от PyQt нет, хотя разработчики и заверяют, что PySide почти ни в чём не уступает, а скоро будет ещё и превосходить. С точки зрения коммерческого лицензирования, с PySide «всё включено» в стоимость лицензии Qt без дополнительной платы, а с PyQt надо ещё платить в Riverbank; с точки зрения Open Source, PySide доступен как под GPLv3, так и под LGPLv3, в то время как PyQt доступен только под GPLv3.
Улучшения в Qt Creator
- Добавлены новые архитектуры в компиляторы GCC, SDCC и IAR EW, основные сведения о которых приведены ниже в таблице:
Компилятор Поддерживаемые архитектуры IAR EW STM8, MSP430 GCC MSP430 SDCC STM8 Теперь эти новые компиляторы автоматически определяются на вкладке «Tools -> Options -> Kits -> Compilers -> Auto-detected».
Например, у меня это выглядит следующим образом:
В ОС Windows авто-определение компилятора GCC для архитектуры MSP430 не реализовано, т.к. данный набор предоставляется в виде простого архива, а не в виде инсталлятора.
Но никто не мешает добавить этот GCC компилятор (да и любой другой поддерживаемый) вручную, при этом, Qt Creator корректно определит ABI компилятора:Примечание: И конечно же, у всех компиляторов будут автоматически определены директории с заголовками, пред-определенные макросы и прочее для корректной подсветки кода. - По пожеланиям трудящихся была добавлена поддержка SVD файлов описания регистров периферии микроконтроллеров. Примечание: Как я знаю, эта возможность доступна только для ARM-ов (хотя, могу ошибаться) и пока что носит экспериментальный характер.
Для использования этой возможности необходимо сначала в настройках устройства «Tools->Options->Devices->YourDevice» в поле «Peripheral description file» выбрать нужный SVD файл, соответствующий целевому микроконтроллеру:Примечание: Эти файлы можно скачать как с сайта ARM, так и взять из директорий с установленными продуктами Keil MDK или IAR EW.
Далее, после запуска отладки нужно в меню «Window->Views» выбрать «Peripheral Registers». После чего откроется панель «Peripheral Registers» (аналогичная панели «Registers») в которой по клику правой клавиши мыши вызовется меню с перечнем групп регистров, которые необходимо отобразить:
Выбираем любую группу (например RCC) и, получаем список всех регистров из данной группы с их подробным описанием и значениями, которые можно читать/писать:Примечание: На данный момент реализовано отображение регистров только одной любой выбранной группы.
История
Перенесемся на 26 лет назад. Студенты Haarvard Nord и Eirik Chambe-Eng задумались над новым проектом. В то время они занимались разработкой GUI для системы, которая работала на Unix, Macintosh и Windows. Это было трудно. Летом 1990 они решили, что им нужна объектно-ориентированная система отображения.
В 1993 было разработано первое графическое ядро
Эта версия называлась Quasar. Тогда не существовало пространств имен. Motif (библиотека элементов интерфейса и набор спецификаций для разработки графических интерфейсов под X Window System) имела свой префикс. Поэтому был добавлен префикс «Q», который исполнял роль пространства имен. Сейчас от той версии сохранилось многое. Остался QObject — центральная часть, реализующая механизм сигналов/слотов. А также QEvent, QFont, QPainter, QColor.
В 1994 они убедили своих жен поддержать их финансово пару лет, и основали компанию Trolltech.
Ранняя версия сайта Trolltech
Проект был еще довольно сырой. К тому же продажи ПО через интернет в те времена не пользовались популярностью, предпочитали физические носители. Соответственно денег было мало.
1996: Qt 1.0
Работал полностью без шаблонов. Поэтому было несколько специализированных списков для указателей, целых чисел и пр. Поддерживались Windows 95/NT и UNIX/X11. Версия для UNIX была с открытым кодом, так как маленькой компании нужно было как-то распространить свой продукт.
New Project: Kool Desktop Environment (KDE)
В 1997 Маттиас Эттрих (известный за свой вклад в проект KDE) решил использовать Qt для создания KDE. Вероятно это и стало причиной по которой Qt «взлетел».
1999: Qt 2.0
Был выпущен под лицензией GPL. Появилась поддержка юникода. Проекту был предоставлен венчурный капитал. Количество сотрудников за год увеличилась с 5 до 50.
Были разработаны основные виджеты, а также слои, обеспечивающие «гибкий» интерфейс. Но людям не хотелось писать код для этого. Тогда появился Qt Designer.
первая версия
В это время я перешел на работу в Trolltech
2001: Qt 3
Мы заменили explicit sharing на implicit sharing для строк. У людей появилась куча проблем со строками. Тогда мы решили оставить implicit sharing, но создавать новый внутренний экземпляр, когда строка меняется (copy-on-write) .
Стали использовать больше шаблонов, C++98. Появился qobject_cast<> (аналог dynamic_cast для QObject, но не использующий RTTI). Открыты исходники для Mac.
2005: Qt 4
Тщательно пересмотрели шаблонные и вспомогательные классы. Перешли от хранения указателей на значения в контейнерах к хранению самих значений. Implicit sharing контейнеры стали использовать атомарный подсчет ссылок. Открыты исходники для Windows. Для Windows это было сделано в последнюю очередь, потому что нам был нужен доход и покупатели чтобы выжить.
Nokia приобретает Trolltech
Nokia была заинтересована в общем API для их платформ (S40, Symbian & Maemo/MeeGo). Были получены огромные инвестиции в Qt. Мы долгое время хотели разработать кроссплатформенное IDE, но не было средств. Руководство предлагало Eclipse, но она не очень хороша для C++. C Nokia наше желание стало возможным и был создан Qt Creator. А также Qt Quick. Еще мы стали работать над интеграцией движка WebKit. Nokia сменила лицензию с GPL на LGPL, что сделало фреймворк еще более свободным.
В 2012 мы разошлись с Nokia.
2011/2012 Qt 5
Digia приобрела Qt.
Портировать на новые платформы было трудно, поэтому добавили слой абстракции. Хорошо поработали над графическим интерфейсом, он перестал быть статичным. Например, это видно по окошку Dock Widget во время перемещения.
Список инструментов и их показатели памяти
| GUI тулкит | Собственная память (MB) | Замечания |
| xcb | 0.132 | |
| xlib | 0.156 | |
| nuklear (rawfb) | 0.624 | не увеличивает потребляемую Xorg память |
| xforms | 0.765 | |
| WINAPI (Win10) | 1.00 | на Windows 10 |
| dlib | 1.10 | |
| SDL2 (without opengl) | 1.10 | |
| GDK | 1.20 | |
| turbo vision | 1.30 | TUI |
| nana | 1.40 | |
| Motif | 1.50 | |
| FLTK | 1.70 | |
| MSEGui | 2.04 | |
| FOX | 2.20 | |
| nuklear (x11) | 2.20 | 0,4 Мб + 1,8 Мб памяти Xorg |
| WINAPI (WINE) | 2.30 | |
| LCL (customdrawn) | 2.50 | |
| Gtk+2 | 2.80 | |
| wxX11 | 3.00 | не готов к использованию в production |
| libui | 4.00 | |
| LCL (Gtk) | 4.50 | |
| Gtk+3 | 5.00 | |
| wxGtk3 | 6.00 | |
| EFL | 7.20 | |
| GLFW | 9.00 | |
| JUCE | 10.00 | бинарник Projucer, окно не пустое |
| Sciter | 10.00 | около 10 Мб, отсутствует Linux Scapp |
| LCUI | 11.00 | |
| GLUI | 12.50 | |
| SFML | 13.20 | |
| nanogui | 14.00 | |
| SDL | 14.00 | |
| U++ | 14.00 | |
| Agar | 15.00 | |
| Dear ImGUI (SDL) | 15.30 | |
| GuiLite | 15.80 | |
| Dear ImGUI (SDL/Vulkan) | 16.50 | |
| Mono WinForms | 16.564 | на Windows 10 |
| Qt | 17.00 | |
| Ultralight | 20.00 | |
| revery | 23.50 | |
| Java Swing | 59.30 | OpenJDK 12 |
| electron | 74.60 | |
| JavaFX | 80.00 | OpenJDK 12 |
| horus_ui | 94.00 | |
| Flutter Desktop | 98.00 | upd: на ранних стадиях разработки! |
| Boost.UI | — | использует wxWidgets |
| CEGUI | — | как это вообще собрать? :(? |
| IUP | — | схож с wxWdigets, использует Gtk+ на Linux |
| Lgi | — | использует Gtk+ 2 |
| MiniGUI | — | не удалось выполнить сборку |
| morda | — | не удалось выполнить сборку |
| SFGUI | — | использует SFML |
| TGUI | — | использует SFML |
| Verdigris | — | использует Qt |
Я был удивлен прожорливостью Flutter, учитывая, что он изначально задумывался как фреймворк для создания GUI мобильных устройств.
Flutter Desktop всё еще находится на ранних стадиях разработки, и все сборки являются отладочными. Это означает, что все профайлеры (вроде Observatory) активны, все утверждения отладки включены, а компилятор AoT отключён. Будет интересно перепроверить данные с использованием релизной сборки.
Не скажу, что меня поразили показатели Electron.
Java-фреймворки Swing и JavaFX тоже показали интересные результаты. Они оба крайне ненасытны, и если вы не уверены, какой из них подошел бы для вашего нового Java-проекта, то кажется разумным остановить свой выбор на более удобном и современном фреймворке JavaFX, хотя и придется отсыпать ему чуть больше памяти. Но если память у вас на вес золота, то, конечно, выбирайте Swing.
WxWidgets и LCL заняли хорошие позиции в этом сравнении. Несмотря на то, что они представляют собой обертки над другими инструментами для GUI, затраты ресурсов у них минимальны. Мне импонирует мысль о возможности перевода бекенда с Gtk+, например, на Qt, тем самым гарантируя независимость от инструментов.
Не так просто, как кажется
Так что же нам необходимо измерить? Виртуальную память (VSZ)? Резидентная память (RSS)? Собственная RSS? Разделяемая RSS?
Если коротко, то… я считаю, что при сравнении двух одинаковых программ, разработанных с использованием разных наборов инструментов, правильнее всего будет измерить объем занимаемой процессом собственной памяти с smaps. Ksysguard использует smaps при выводе подробной информации о памяти. Однако с самого начала в своём эксперименте я использовал данные из панели потребления RAM по умолчанию, и только потом мне стало известно, что smaps дают более точные цифры. В целях обеспечения согласованности данных я использовал информацию из дефолтной панели RAM для всех представленных в списке инструментов, хотя, скорее всего, при использовании интерфейса с подробным описанием потребления памяти можно было бы видеть аналогичную ситуацию.