В чем разница между GTK + и Qt?

Языки программирования и инструментарий — сложные темы. Вероятно, вам удавалось использовать компьютеры долгое время, не задумываясь.
Но когда вы переключились на Linux, проблема внезапно стала актуальной. Это потому, что насколько хорошо приложение интегрируется с остальной частью вашего рабочего стола, часто возникает вопрос: сделано ли оно в GTK + или Qt?
Что такое GTK + и Qt?
GTK + и Qt — это наборы инструментов, используемые разработчиками для структурирования внешнего вида и ощущения приложения. Эти наборы инструментов предоставляют кнопки, панели инструментов, ползунки и меню, которые вы видите при использовании приложения.

Инструментарий экономит время разработчиков. Вместо того, чтобы кодировать или проектировать размер, форму и внешний вид каждой кнопки, они могут позволить инструментарию позаботиться об этой работе. Это позволяет им сосредоточиться на основных функциях, которые предоставляет приложение, таких как редактирование документов или воспроизведение музыки.
История GTK + и Qt
Haarvard Nord и Eirik Chambe-Eng начали разработку Qt в 1991 году. Название, которое произносится как «милый», появилось из-за того, как буква Q выглядела шрифтом Eavcs Haavard, и из-за предыдущего использования буквы t в Xt, X инструментарий уже используется на рабочих столах Unix.
Nord и Chambe-Eng позже стали соучредителем Quasar Technologies, которая стала Throll Tech, затем Throlltech, и теперь существует в другой форме, как The Qt Company.
В 1995 году Throll Tech выпустила исходный код для версии Qt для Linux. Но это не соответствовало определению Free Software Foundation в отношении свободного поскольку людям не разрешалось распространять код, если они вносили какие-либо изменения. Лишь в 2000 году Throlltech предоставил пользователям свободу свободно редактировать и распространять код.
GTK + начинался как GIMP Toolkit, созданный Питером Маттисом в качестве замены существующего интерфейса, используемого в программе манипуляции изображениями GNU. После переписывания инструментарий стал GTK + и был выпущен в 1998 году. В отличие от Qt, у людей была свобода редактировать, изменять и делиться GTK + с самого начала.
Хотя Qt в некотором смысле является более универсальным и адаптируемым инструментарием, сообщество в течение первых лет консолидировалось вокруг GTK +. Стоит также отметить, что некоммерческий фонд GNOME теперь поддерживает GTK +, в то время как публично торгуемая компания The Qt Company ведет разработку Qt. Тем не менее, на данный момент ни один инструментарий не является «более бесплатным», чем другой.
Настольные ПК и программное обеспечение на базе GTK

Если вы недавно перешли на Linux, есть большая вероятность, что вы используете настольный компьютер на базе GTK. Это потому, что во многих из лучших настольных сред Linux используется GTK +.
Возьмите GNOME, опцию по умолчанию в таких известных и хорошо зарекомендовавших себя ОС Linux, как Ubuntu, Fedora и Debian. Затем есть альтернативы, такие как MATE и Xfce, которые предлагают более легкие и более традиционные интерфейсы.
Давайте не будем забывать об Elementary OS, новичке, который больше обслуживает последние коммутаторы, чем давние пользователи Linux.
Многие из самых популярных приложений с открытым исходным кодом лучше интегрируются с десктопами на базе GTK. Это включает в себя такие программы, как Firefox, Thunderbird, LibreOffice и GIMP. Менее известные кроссплатформенные приложения на основе GTK включают AbiWord, Inkscape и Pidgin.
Среди приложений GTK + растет степень разнообразия. Программное обеспечение, разработанное специально для GNOME, может выглядеть неуместно даже на других настольных ПК на базе GTK. Это связано с тем, что руководящие принципы разработки интерфейса пользователя GNOME не поощряют использование меню и вносят другие, менее распространенные изменения.
Также знайте, что многие приложения, предназначенные для elementaryOS, недоступны для других рабочих столов.
Между тем, большинство вышеупомянутых популярных кроссплатформенных инструментов GTK + остаются относительно независимыми от настольных компьютеров (что означает, что они выглядят неуместно в GNOME и элементарной OS, поскольку акцент делается на уникальном дизайне).
Настольные ПК и программное обеспечение на основе Qt

Рабочий стол KDE Plasma является старейшей полнофункциональной рабочей средой для Linux. Если бы в 1996 году Qt был полностью открыт, GNOME, возможно, даже не существовало бы. Более двух десятилетий спустя сообщество KDE продолжает предоставлять самый многофункциональный рабочий стол Linux.
Поскольку существует так мало других настольных ПК на базе Qt, многие приложения Qt специально разработаны для настольных компьютеров Plasma и могут даже зависеть от различных компонентов KDE. По этой причине интеграция программного обеспечения KDE является одной из лучших среди любых настольных систем.
Вы можете настроить интерфейс, который влияет на каждое приложение, или вы можете настроить одно приложение, пока оно не станет удобным. Тем не менее, рабочий стол Plasma не единственный, который использует Qt. LXQt — это одна из альтернатив, которая фокусируется на том, чтобы быть легче и проще.
Хотя некоторые программы KDE являются кроссплатформенными, эти программы не так известны за пределами сообщества Linux. Наиболее заметными исключениями могут быть Krita и digiKam.
Не все программное обеспечение Qt специально разработано для KDE. К таким программам относятся медиаплеер VLC и настольное издательское приложение Scribus.
Разница имеет значение?
Есть технические различия между GTK + и Qt, но большинство из них больше интересуют разработчиков, чем остальные из нас. В наши дни ограничения еще труднее заметить, чем раньше. Благодаря отличной тематике многие приложения GTK + теперь выглядят как дома на рабочем столе Plasma на базе Qt. Некоторые из этих приложений выглядят больше на плазме, чем в GNOME.
Между тем, вы также можете установить Scribus или VLC на рабочий стол на базе GTK, даже не осознавая, что есть разница.
Но небольшие несовместимости появляются время от времени. Приложения могут открывать другое окно выбора файлов, когда вы ищете файл для открытия. Настройки системных тем могут относиться к определенным приложениям, но не к другим. Чем больше вы возитесь с вашим рабочим столом, тем больше причуд может появиться.
В конечном счете, вопрос о том, предпочитаете ли вы GTK + или Qt, сводится к выбору вашего любимого интерфейса рабочего стола и ваших любимых приложений для Linux.
Как узнать, какая версия GTK+ установлена на Ubuntu?
предложение сообщит вам, какая минорная версия 2.0 установлена. Разные версии имели разные имена пакетов, потому что они могут сосуществовать в системе (для поддержки приложений, построенных с более старыми версиями).
даже для файлов разработки, которые обычно позволяют иметь только одну версию в системе, вы можете иметь версию gtk 1.x и версия gtk 2.0 в той же системе (включаемые файлы находятся в каталогах, называемых gtk-1.2 или gtk-2.0).
короче говоря, нет простого ответа на вопрос»какая версия GTK находится в системе». Но.
попробуйте что-то вроде:
чтобы перечислить все пакеты libgtk, включая-dev, которые находятся в вашей системе. dpkg -l перечислит все пакеты, о которых знает dpkg, включая те, которые в настоящее время не установлены, поэтому я использовал grep для перечисления только тех, которые установлены (строка начинается с i).
кроме того, и вероятно, лучше, если это версия заголовков и т. д., которые вас интересуют, используйте pkg-config:
расскажет вам, какая версия GTK 1.файлы разработки установлены, и
расскажет вам, какая версия GTK 2.0. Старый 1.версия x также имеет свою собственную программу gtk-config, которая делает то же самое. Аналогично, для GTK+ 3:
Введение в GTK+
Теперь, когда вы познакомились с системой X Window System, самое время рассмотреть комплект инструментальных средств GTK+ Toolkit. GTK+ появился на свет как часть популярного графического редактора GNU Image Manipulation Program (GIMP), от которого он и унаследовал свое имя (The Gimp ToolKit). Очевидно, что программисты GIMP всерьез предвидели превращение GTK+ в самостоятельный проект, поскольку он вырос и стал один из самых мощных и популярных комплектов инструментов. Домашнюю страницу проекта GTK+ можно найти по адресу https://www.gtk.org/.
Примечание
В итоге, GTK+ — это библиотека, которая существенно упрощает создание графических интерфейсов пользователя (Graphical User Interface, GUI), предоставляя набор готовых компонентов, именуемых виджетами которые вы соединяете вместе с помощью легких в использовании вызовов функций, включенных в логическую структуру вашего приложения
Несмотря на то, что GTK+ — это проект GNU, как и GIMP, он выпущен на условиях более либеральной лицензии (Lesser General Public License, Стандартная общественная лицензия ограниченного применения GNU), которая освобождает программное обеспечение (включая патентованное программное обеспечение с закрытым программным кодом), написанное с использованием GTK+, от уплаты лицензионных вознаграждений или авторских гонораров, а также других ограничений.
Комплект GTK+ целиком написан на языке C и большая часть программного обеспечения GTK+ также написана на C. К счастью, существует ряд привязок к языкам (linguage binding), позволяющих применять GTK+ в предпочитаемом вами языке программирования, будь то C++, Python, PHP, Ruby, Perl, C# или Java.
Комплект GTK+ сформирован как надстройка для ряда других библиотек. К ним относятся следующие:
GLib — предоставляет низкоуровневые структуры данных, типы, поддержку потоков, циклов событий и динамической загрузки;
GObject — реализует объектно-ориентированную систему на языке C, не требующую применения языка C++;
Pango — поддерживает визуализацию и форматирование текста;
ATK — помогает создавать приложения с доступом и возволяет пользователям запускать ваши приложения с помощью средств чтения экрана и других средств доступа;
GDK (GIMP Drawing Kit) — обрабатывает визуализацию низкоуровневой графики поверх библиотеки Xlib;
GdkPixbuf — помогает манипулировать изображениями в программах GTK+;
Cairo — библиотека для отрисовки векторной графики;
Xlib — предоставляет низкоуровневую графику в системах Linux и Unix.
Система типов Glib
Если вы когда-нибудь просматривали программный код GTK+, то могли удивиться, увидев множество типов данных языка C с префиксом g , например, gint , gchar , gshort , а также незнакомые типы gint32 и gpointer . Дело в том, что комплект GTK+ основан на библиотеках переносимости языка C (portability libraries), названных GLib и GObject, которые определяют эти типы для того, чтобы способствовать межплатформным разработкам.
GLib и GObject помогают межплатформным разработкам, обеспечивая стандартный набор типов данных замещения, функций и макросов для поддержки управления памятью и общих задач. Эти типы, функции и макросы означают, что, как программисты GTK+, мы можем быть уверены в том, что наш программный код надежно переносится на другие платформы и архитектуры.
В библиотеке GLib также определено несколько очень удобных констант:
Дополнительные типы данных — это типы, служащие заменой для стандартных типов данных C (из соображений совместимости и читабельности) и гарантирующий одинаковый размер в байтах на всех платформах:
gint , guint , gchar , guchar , glong , gulong , gfloat и gdouble — просто замены для стандартных типов C для совместимости;
gpointer — синоним типа (void *) ;
gboolean — полезен для представления логических значений и служит оболочкой для int ;
gint8 , guint8 , gint16 , guint16 , gint32 и guint32 — знаковые и беззнаковые типы с гарантированным размером в байтах.
Удобно то, что применение библиотек GLib и GObject почти прозрачно. GLib широко используется в GTK+, поэтому если у вас есть работающая установка GTK+, то вы обнаружите, что библиотека Glib уже установлена. Как вы увидите позже в этой главе, при программировании с помощью комплекта GTK+ вам даже не придется явно включать заголовочный файл glib.h .
Система объектов GTK+
Все, у кого уже есть опыт программирования GUI, возможно, поймут наше утверждение о строгой приверженности библиотек GUI концепции объектно-ориентированного программирования (ООП), настолько строгой, что все современные комплекты инструментов, включая GTK+, написаны в стиле объектно-ориентированного программирования.
Несмотря на то, что комплект инструментов GTK+ написан на чистом C, он поддерживает объекты и ООП благодаря библиотеке GObject. Эта библиотека поддерживает наследование объектов и полиморфизм с помощью макросов.
Давайте рассмотрим образец наследования и полиморфизма на примере иерархии объектов GtkWindow , взятой из документации GTK+ API.
Этот список объектов говорит о том, что объект GtkWindow — потомок GtkBin , и, следовательно, любую функцию , которую вы вызываете с объектом GtkBin , вы можете вызвать и с объектом GtkWindow . Точно так же объект GtkWindow наследует из объекта GtkContainer , который в свою очередь наследует из объекта GtkWidget .
Для удобства все функции создания виджетов возвращают тип GtkWidget . Например,
Предположим, что вы создаете объект GtkWindow и хотите передать возвращенное значение в функцию, ожидающую объект типа GtkContainer , например, такую, как gtk_container_add :
Вы применяете макрос GTK_CONTAINER для приведения типов GtkWidget и GtkContainer :
Назначение этих функций вы узнаете позже; сейчас просто отметьте для себя частое применение макросов. Для каждого возможного приведения типа существует макрос.
Примечание
Не беспокойтесь, если вам всё это не очень понятно; вам не нужно разбираться в подробностях ООП для того, чтобы освоить GNOME/GTK+. На самом деле это безболезненный способ усвоить идеи и преимущества ООП на базе знакомого вам языка C.
Знакомство с GNOME
GNOME — имя, данное проекту, начатому в 1997 г. программистами, работавшими в проекте GNU Image Manipulation Program (GIMP) над созданием унифицированного рабочего стола для Linux. Все были согласны с тем, что выбор ОС Linux как платформы рабочего стола тормозился отсутствием согласованной стратегии. В то время рабочий стол Linux напоминал Дикий Запад без общих стандартов или выработанных на практике приемов, и программисты могли делать всё, что вздумается. Без свободной группы, контролирующей меню рабочего стола, согласованное представление и отображение, документацию, трансляцию и т. д., освоение рабочего стола новичком было в лучшем случае путанным, а в худшем — непригодным.
Группа GNOME намеривалась создать рабочий стол для ОС Linux с лицензией GPL, разрабатывая утилиты и программы настройки в едином согласованном стиле, одновременно способствуя развитию стандартов для взаимодействия приложений, печати, управления сеансами и лучших приёмов в программировании GUI приложений.
Результаты их стараний очевидны: среда GNOME — основа стандартного рабочего стола Linux в дистрибутивах Debian, Fedora, Red Hat, Ubuntu и др. (рис. 1).
Рис. 1. Обзор активности в GNOME 3
Первоначально название GNOME означало GNU Network Object Model Environment (среда сетевых объектных моделей GNU), что отражает одну из ранее поставленных задач, внедрение в систему Linux объектной интегрированной системы, такой как Microsoft OLE, для того, чтобы вы могли, например, встроить электронную таблицу в документ текстового процессора. Теперь поставлены новые задачи, и то, что сегодня нам известно как GNOME, — это законченная вреда рабочего стола, содержащая панель для запуска приложений, комплект программ и утилит, библиотеки программирования и средства поддержки разработчиков.
Перед тем как начать программировать, следует убедиться в том, что все необходимые библиотеки установлены.
Установка библиотек разработки GTK+
В этой главе вы будете работать с GTK+ 3, поэтому убедитесь в том, что установлены библиотеки версии 3.x .
В дистрибутиве Debian и основанных на Debian системах, таких как Ubuntu, вы можете использовать программу apt (или apt-get ) для установки пакетов GTK+ с разных сайтов-зеркал (mirrors). Так для установки библиотек разработки GTK+ будет команда:
Опробуйте также демонстрационное приложение GTK+ — gtk3-demo , в котором показаны практически все виджеты и их оформление (рис. 2). Установить gtk3-demo можно командой:
Рис. 2. gtk3-demo — демонстрационное приложение GTK+
Примечание
Для каждого виджета отображаются вкладки Info (Информация) и Source (Исходный код). На вкладке Source приведен программный код на языке C для применения данного виджета. На ней может быть представлено множество примеров.
Пример: Обычное окно GtkWindow
Давайте начнем программирование средствами GTK+ с простейшей из программ GUI — отображения окна. Вы увидите библиотеку GTK+ в действии и большой набор функциональных возможностей, получаемых из очень короткого программного кода.
Введите программу и назовите её gtk1.c :
Для компиляции gtk1.c введите следующую команду:
Примечание
Будьте внимательны и набирайте обратные апострофы, а не обычные апострофы — помните о том, что обратные апострофы — это инструкции, заставляющие оболочку выполнить заключенную в них команду и добавить ее вывод в конец строки.
Когда вы выполните программу с помощью следующей команды, ваше окно должно раскрыться (рис. 3).
Рис. 3. Обычное окно GtkWindow
Учтите, что вы можете перемещать окно, изменять его размер, сворачивать и раскрывать его на весь экран.
Как это работает
Включить заголовочные файлы, необходимые для библиотек GTK+ и связанных с ними библиотек, можно с помощью одного оператора #include <gtk/gtk.h> . Далее вы объявляете окно как указатель на объект GtkWidget .
Затем для инициализации библиотек GTK+ следует выполнить вызов gtk_init , передав аргументы командной строки argc и argv . Это дает возможность GTK+ выполнить синтаксический анализ любых параметров командной строки, о которых комплект должен знать. Учтите, что вы всегда должны инициализировать GTK+ таким способом перед вызовом любых функций GTK+.
Суть примера заключается в вызове функции gtk_window_new . Далее приведен ее прототип:
Параметр type может принимать в зависимости от назначения окна одно из двух значений:
GTK_WINDOW_TOPLEVEL — стандартное окно с рамкой;
GTK_WINDOW_POPUP — окно без рамки, подходящее для диалогового окна.
Почти всегда вы будете применять значение GTK_WINDOW_TOPLEVEL , потому что для создания диалоговых окон, как вы узнаете позже, есть гораздо более удобные способы.
Вызов gtk_window_new создает окна в памяти, таким образом у вас появляется возможность перед реальным выводом окна на экран заполнить его виджетами, изменить размер окна, его заголовок и т. д. Для того чтобы окно появилось на экране, выполните вызов функции gtk_widget_show :
Эта функция принимает указатель типа GtkWidget , поэтому вы просто предоставляете ссылку на свое окно.
Последним вы выполняете вызов функции gtk_main . Эта основная функция запускает процесс обмена информацией (interactivity process), передавая управление GTK+, и не возвращает его до тех пор, пока не будет выполнен вызов функции gtk_main_quit . Как видно в программе gtk1.c , этого никогда не происходит, поэтому приложение не завершается даже после закрытия окна. Проверьте это, щелкнув кнопкой мыши пиктограмму закрытия окна и убедившись в отсутствии строки приглашающей вводить команду. Вы исправите это поведение после того, как познакомитесь с сигналами и обратными вызовами в следующем разделе. Сейчас завершите приложение, нажав комбинацию клавиш <Ctrl>+<C> в окне командной оболочки, которое вы использовали для запуска программы gtk1.