Для разработки и реализации графического пользовательского интерфейса (GUI) в настоящее время существуют разные инструменты. Как правило, такие инструменты представляют собой фреймворк (библиотека специализированных программных инструментов), для функционирования и использования которого необходима соответствующая среда рабочего окружения. Такая ситуация например, с окружением JRE для написания GUI на Java. Примерно то же самое и с .Net – огромный неповоротливый фреймворк. В итоге, многие программисты задумываются над поиском более независимого, лёгкого и универсального инструмента. Желательно такого, чтобы для запуска и работы приложений на его основе не нужно было его «носить с собой». Именно такой альтернативой и является библиотека wxWidgets. В данной статье будут рассмотрены основные возможности этой библиотеки, а также её сборка для Linux-систем.
Почему именно wxWidgets?
Несмотря на то, что wxWidgets не является такой популярной, как .Net, Qt иди Java, однако возможности этой библиотеки куда более привлекательны, особенно для тех разработчиков, которые ценят качественную переносимость приложений между платформами, а также скорость их работы и потребление ресурсов.
Фреймворк .Net довольно тяжёл. Производительность приложений на основе .Net оставляет желать лучшего. Совместимость с UNIX-подобными системами для него также является проблемой. И это направление в виде платформы Mono представляется далеко не самым перспективным.
Qt-фреймворк, основанный на C++, хоть и является более быстрым и переносимым по сравнению с .Net, однако не совсем ясна ситуация с его лицензией. Существует открытая и коммерческая лицензии этого инструментария. Что, очевидно, налагает некоторые ограничения на использование свободной его версии. Иначе бы параллельно не существовало коммерческой ветки с более широкими возможностями. Этот факт также заставляет сомневаться относительно перспектив проектов на Qt. В техническом же отношении, этот фреймворк не обеспечивает полноценный нативный внешний вид приложений. Контроллы и элементы управления выглядят несколько иначе, нежели отрисовываемые средствами WinAPI в Windows или на GTK в UNIX-системах. Зачастую, это смущает и отпугивает пользователей.
Приложения на Java работают как минимум в полтора раза медленнее, чем на C/C++. Это далеко не секрет. Так же, как и то, что приложения, созданные на основе Java-апплетов внешне никак не вписываются в нативный стиль оформления ни одной из платформ. Пользователям не нравится работать с необычно и даже коряво выглядящими элементами интерфейса Java-приложений. При этом, как и в случае с .Net, необходимо всюду, на любой используемой платформе иметь установленную среду JRE для работы Java-апплетов. Именно такая возня и отталкивает многих разработчиков от использования Java.
Практически всех вышеперечисленных недостатков лишена wxWidgets – абсолютно открытая и свободная библиотека, которая способна отрисовывать GUI с помощью API платформы. Это значит, что окна приложений на wxWidgets и элементы интерфейса выглядят стандартно, гармонично вписываясь в оформление рабочего стола используемой платформы. При этом скорость работы и производительность таких приложений действительно впечатляет. Сама же библиотека написана на C++ и представляет собой набор классов, реализующих весь функционал библиотеки. Эти классы подключаются к проектам и используются как базовые, для создания приложений. Основными преимуществами wxWidgets над другими аналогами являются:
- быстродействие и производительность, ведь инструкции о рисовании элементов интерфейса транслируются непосредственно к стандартному API платформы без каких-либо промежуточных программных интерфейсов и сред;
- отсутствие обязательной предустановки wxWidgets – просто собрал и используй, подключая заголовочные файлы и файлы библиотек к проекту;
- сравнительно небольшой размер собранных приложений, даже при их статической линковке;
- быстрое создание GUI вручную из кода, без использования RAD-утилит, которые, кстати, для wxWidgets тоже существуют, например wxSmith в Code::Blocks IDE, wxFormBuilder или wxCrafter в CodeLite IDE.
Стоит еще раз обратить внимание на то, как wxWidgets рисует элементы управления интерфейса. Приложение, написанное на wxWidgets, которое скомпилировано в Windows, будет отображаться стандартными средствами WinAPI. Код того же самого приложения, без каких-либо изменений, но скомпилированный под UNIX будет рисоваться также стандартными средствами, т. е. на GTK. Можно даже собрать GUI на wxWidgets так, что оно будет использовать самый, что ни на есть чистейший X11. И это без изменения кода. Вот, что такое по-настоящему качественная переносимость.
Кроме богатых возможностей создания GUI wxWidgets имеет и ряд других функций, таких как работа с сокетами, регулярными выражениями, работа с базами данных (БД), HTTP-сервер, клиенты HTTP и FTP обработка XML и полноценная поддержка графических библиотек, таких как OpenGL.
Казалось бы, почему при всех своих достоинствах, wxWidgets практически непопулярен? Во-первых, это проект, который начинался всего одним человеком. В 1992 году над ним начал работать его создатель — Джулиан Смарт. Он и в настоящее время занимается поддержкой wxWidgets, но уже в составе небольшой группы. Таким образом, wxWidgets – это продукт творчества, а не коммерческий проект, над которым работает армия программистов и который продвигается благодаря рекламным кампаниям. Это и есть главный недостаток wxWidgets. И как следствие — небольшое количество обучающих и поддерживающих ресурсов. Основными из которых являются официальный ресурс вики, а также форумы сообщества.
Примеры приложений, созданных на wxWidgets
Несмотря на не самую выдающуюся популярность, приложений на основе wxWidgets достаточно много. Среди таковых, кстати, есть и снискавшие уважение пользователей, например Code::Blocks IDE:
Существует также ещё одна IDE, подобная Code::Blocks. Но с более изящным оформлением, удобным функционалом и несколько более дружественным GUI – это CodeLite:
Графический интерфейс популярного кроссплатформенного FTP-клиента FileZilla также написан на wxWidgets:
Популярным бесплатным звуковым редактором, доступным для всех платформ является Audacity, который, как можно догадаться, для отображения GUI использует библиотеку wxWidgets:
Сборка wxWidgets под Linux
Для своей компиляции библиотека wxWidgets не требует сторонних или дополнительных зависимостей. Для начала нужно скачать архив с исходными текстами библиотеки:
$ wget https://github.com/wxWidgets/wxWidgets/releases/download/v3.0.4/wxWidgets-3.0.4.tar.bz2
Распаковка загруженного архива:
$ tar -xvf wxWidgets-3.0.4.tar.bz2
Содержимое архива будет распаковано в поддиректорию wxWidgets-3.0.4 текущего каталога. Теперь нужно перейти в каталог с исходниками и создать в нём директорию для сборки, например gtk-build:
$ cd wxWidgets-3.0.4 $ mkdir gtk-build $ cd gtk-build
Далее, необходимо сконфигурировать будущую сборку, выполнив скрипт конфигурации, передав ему необходимые параметры:
$ ../configure –-with-gtk3 –-disable-shared –-enable-unicode –-with-opengl –-prefix=/opt/wxwidgets-gtk3/ --with-libmspack --with-sdl
Назначение указанных параметров следующее:
- –-with-gtk3 — включение поддержки GTK версии 3;
- –-disable-shared — включение статической линковки, при которой библиотеки wxWidgets будут включены в исполняемый файл;
- —enable-unicode – поддержка Юникода в приложении;
- —with-opengl – поддержка графической библиотеки OpenGL, на случай, если кому-то нужно написать свой игровой движок;
- —prefix=PATH – здесь (вместо PATH) указывается желаемое расположение библиотеки в файловой системе. Т. е. куда она будет впоследствии установлена;
- —with-libmspack – поддержка форматов сжатия Microsoft, таких как *.CAB, *.CHM и т. д., для большей кроссплатформенности не помешает;
- —with-sdl – поддержка библиотеки SDL для создания графического контекста окон и фреймов, когда не хочется это делать вручную.
Приведённый перечень параметров сборки является наиболее универсальным и позволяет создавать практически любые приложения на wxWidgets. В результате вывод команды (несколько последних строк) configure должен быть примерно таким:
Если сборка завершилась ошибкой установите необходимые пакеты и библиотеки, например в убунту
apt-get install gcc apt-get install build-essential apt-get install libgtk-* apt-get install freeglut3-dev
Теперь можно приступить непосредственно к сборке:
$ make -j4
Здесь ключ -j — это количество потоков для одновременной обработки нескольких задач сборки. В случае, когда используется 8-ядерный/16-поточный процессор, такой как например, AMD Ryzen 7 2700, можно указать -j16. Чем больше потоков, тем быстрее сборка.
Далее, после окончания сборки, самое время установить готовую библиотеку wxWidgets:
$ make install
В результате файлы библиотеки и файлы заголовков будут скопированы в соответствии с указанным на этапе конфигурирования, в параметре —prefix значением — в /opt/wxwidgets-gtk3/
. Если нужно, чтобы библиотека устанавливалась там же, где и была собрана, то следует задать --prefix=$(pwd)
.
Далее, для удобства можно установить переменную окружения, чтобы использовать служебную команду wx-config, добавив в файл ~/.bashrc строку, перезапустив после этого сеанс пользователя:
$ export PATH=”/opt/wxwidgets-gtk3/bin:PATH”
Проверка, что всё работает:
$ wx-config --version 3.0.4
Команда ws-config используется для определения путей подключения заголовочных файлов и библиотек. Которые необходимы для указания компилятору и линковщику. Так, например, для того, чтобы скомпилировать проект на wxWidgets. Необходимо передать компилятору то, что возвращает команда wx-config:
$ g++ MywxWidgetsApp.cpp `wx-config --cxxflags --libs` -o MywxWidgetsApp
Здесь параметры «—cxxflags» и «—libs» указывают, что команда wx-config должна возвратить требуемый для удачной сборки набор флагов компилятора и пути подключения заголовочных файлов и библиотек wxWidgets.
Заключение
В заключение важно заметить, что библиотека wxWidgets поставляется в готовом виде практически в любом из дистрибутивов Linux. Однако далеко не всегда это универсальные сборки. Часто бывает, особенно это касается сложных проектов, что необходимо пересобрать wxWidgets с нужными параметрами. Задействовав таким образом дополнительные возможности, которых нет в стандартной сборке из репозитория дистрибутива. Для того, чтобы узнать, какие параметры сборки и возможности доступны, нужно выполнить команду ../configure —help в каталоге сборки wxWidgets. В результате будет выведен список доступных параметров и их назначение.
Как можно видеть, wxWidgets – это действительно универсальная и по-настоящему кроссплатформенная библиотека. Которая является достойным (если не самым лучшим) выбором для создания быстрых и платформонезависимых приложений любой сложности и направленности.
Спасибо за понятную лаконичную статью. Только для команды configure есть опечатка: по спецификации необходимо указывать —with-gtk=3 (а не —with-gtk3) для включения поддержки GTK3