LINUX.ORG.RU

GTK+ 3 на винде. Нативные UI-элементы.

 , ,


1

2

Да-да, знаю, что оффтопик, но косвенно с линуксом это связано - это портирование GTKшных приложений под разные платформы.

Стал часто натыкаться на сообщения по типу «если пишешь гуйню под винду, то бери qt, ведь gtk в ней выглядит убого». Я вот просто накатил ее на виртуалку и решил проверить, так ли это. Поставил mingw, там поставил пакет gtk3, в комплекте шла демка с кодом на C. В файле /mingw64/bin/gtk-3.0/settings.ini дописал:

[Settings]
gtk-theme-name=win32
Получилось вот это: https://imgur.com/a/Du5AWnn На скринах полностью виндовые элементы гуя, только ползунки там почему-то отображаются немного не так, но это не страшно. Страшнее, что «толстые» шапки окон отображаются как в 7 винде. Похоже, что поддержку таких шапок оставили в качестве легаси. Что же, полмира на семерке еще сидит, так что у них все нормально будет.

Диалог выбора файла и диалог печати тоже виндовые и работают исправно.

На маке раньше были костыли с притягиванием в качестве зависимостей всяких X11 пакетов, но теперь это пофиксили и разработали jhbuild специально для создания GTK+ приложений под мак (не знаю как там с нативной темой, но тем а-ля MacOS довольно много и вполне можно заюзать одну из них).

Этим постом просто хочу развеять мифы о том, что у GTK+ кроссплатформенность хромает и обязательно нужно учить кресты ради Qt. Вполне можно написать на Rust что-нибудь кроссплатформенное и с GUI.

Кстати, все зависимости GTK+ под виндой весят чуть больше 40 МБ, что по сегодняшним меркам не так уж много.

P.S. ИМХО нативные темы - это вовсе необязательно, у виндузятников полно приложений, которые выглядят вырвиглазно на фоне остального. Например фотошоп по умолчанию с темной темой и всем нравится.

Этот пост как раз и показывает, что GTK+ ненужен.

На скринах полностью виндовые элементы гуя

Даже не рядом.

Кстати, все зависимости GTK+ под виндой весят чуть больше 40 МБ

Qt в два-три раза меньше.

RazrFalcon ★★★★★ ()
Ответ на: комментарий от RazrFalcon

А вот тут виндовые, да? https://www.besplatnyeprogrammy.ru/wp-content/uploads/qbittorrent-1.png Скачал только что простенькую прогу на Qt Win32 Disk Imager. 32bit версия весит 45 МБ, там один opengl32sw.dll весит 15 МБ (хз зачем там OpenGL если честно).

ArkaDOSik ()

Всё так. Кроме того, дроч на «нативные» вендоэлементы не нужен. Они говно и каждая третья поделка всё равно себя рисует как хочет, такова жизнь на венде.

anonymous ()
Ответ на: комментарий от anonymous

Да я вообще не из таких, но Adwaita выглядит в винде довольно убого. Наверное надо поискать тему получше, но не обязательно win32 =) Главное, что печать работает и диалог выбора файла не введет пользователя в ступор.

ArkaDOSik ()
Ответ на: комментарий от ArkaDOSik

Это какая-то херня. Мне пришлось его форкнуть, чтобы виндузятники могли заливать образы нашего софта. Сборки весят 12мб, при том, что я туда ещё немного буста впихнул.

WitcherGeralt ★★ ()
Ответ на: комментарий от ArkaDOSik

Скачал только что простенькую прогу на Qt

Ну мою глянь, я её специально под винду статически собирал. Экзешник, куда всё нужное от Qt собрано — 11,7 Мб.

И да, корректно сравнивать не GTK+ с Qt, а GTK+ с QtGui+QtWidgets. Полная Qt - это немножко совсем другой уровень.

hobbit ★★★★★ ()
Последнее исправление: hobbit (всего исправлений: 3)
Ответ на: комментарий от hobbit

Qt 4.8.6

Его ещё больше можно ужать под виндой, например, вырубив неиспользуемые классы с помощью утилиты QConfig. Я добивался размера самой библиотеки Qt 4 в 700-900 КБ.

Впрочем, Qt 5 намного более жирный. И статическая сборка твоего приложения на Qt 5 будет уже где-то 20 МБ.

EXL ★★★★★ ()
Ответ на: комментарий от EXL

Допускаю.

Я, если что, не против GTK. Просто насколько я понимаю, если говорить о кроссплатформенности, то под виндой там многовато придётся скручивать изолентой. А в Qt SDK из коробки есть практически всё нужное, включая систему сборки.

hobbit ★★★★★ ()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от ArkaDOSik

Ну да, ты абсолютно прав, оно просто в инсталлере пожато хорошо, итого 45мб. Специально сходил проверил.

P.S. Оффтопик в виартулке с аптаймом в 4 месяца раскручилвался минут 10, пока я смог через RDP что-то внятное сделать, жесть какая дрянь.

WitcherGeralt ★★ ()
Ответ на: комментарий от hobbit

Впрочем, Qt 5 намного более жирный. И статическая сборка твоего приложения на Qt 5 будет уже где-то 20 МБ.

И кстати, если у тебя есть желание и проект юзает обычный PRO-файл для построения, то можешь это проверить. Для этого совсем не нужно компилировать Qt 5 в статике. Он уже есть в пакетах MSYS2 и его можно просто установить и использовать:

pacman -S mingw-w64-x86_64-qt5-static

Вот только C++-код для статической сборки под Qt 5 требует внесения специальных изменений. См, например, это:

https://github.com/EXLMOTODEV/coolreader/commit/d9c1f3fd62681dc0ccee554679e28...

EXL ★★★★★ ()
Ответ на: комментарий от nvl

Ставите msys2 и вводите pacman -S mingw-w64-x86_64-gtk3 Через mingw сейчас многие проекты собираются, gcc на windows работает отлично. А если еще проще, то есть неофициальный инсталятор: https://github.com/tschoonj/GTK-for-Windows-Runtime-Environment-Installer Он сам все прописывает в PATH и кодить можно на C/C++ хоть в Visual Studio. Еще был установщик для питона, но он не обновляется и работает сейчас только с питоном 3.4. В комплекте с ним шли gjs и Lua-JIT с lgi. На данный момент все это есть в репах msys.

ArkaDOSik ()
Ответ на: комментарий от nvl

Что-то не очень «for end-users».

В винде всё именно так, причем со всеми либами. Однако же, если нет желания возиться с MSYS и хочется юзать более нативные инструменты, то есть пакетный манагер для либ — vcpkg от микрософта, для студии никаких настроек не требует, интегрируется с CMake и содержит большинство нужных либ. В том числе и GTK 3.

Unicode4all ★★★★ ()
Ответ на: комментарий от nvl

Вам нужно использовать MSYS2 под Windows, как рекомендуют разработчики GTK+3, он подтянет все необходимые зависимости для сборки, как в обычном Linux'овом окружении.

и приложение собранное с gtk3 (my-app.exe) будет работать?

Ну если вы сложите к собранному приложению все его DLL-зависимости и зависимости GTK+3, то да. Как у вас сейчас приложение собирается без GTK+3 тогда, раз возникает этот вопрос? Мне непонятен этот момент.

EXL ★★★★★ ()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от WitcherGeralt

Ну вот видите, не удивлюсь, если и GTKшные приложения можно сжимать примерно до такого же размера. Так что думаю, что во-первых сейчас многие Android приложения весят больше, чем эти 40 МБ, а во-вторых есть UPX, если для кого-то это имеет значение. Но может ли кто-нибудь оьъяснить зачем в Qt5 приложении под виндой OpenGL?

ArkaDOSik ()

GTK выглядит душевно, любой. Qt без долгой обработки напильником — как чужеродное ненужно. Хотя это не отменяет юзабельности программ на Кю-те. ¡Que viva GTK!

Hertz ★★★★★ ()
Ответ на: комментарий от EXL

Для этого совсем не нужно компилировать Qt 5 в статике.

Поздно, я уже скомпилировал. :) Билды, правда, всё равно пока выкладываю с 4.8.6, пока не доделал то, для чего мне Qt5 нужна.

hobbit ★★★★★ ()
Ответ на: комментарий от EXL

Ну если вы сложите к собранному приложению все его DLL-зависимости и зависимости GTK+3, то да. Как у вас сейчас приложение собирается без GTK+3 тогда, раз возникает этот вопрос? Мне непонятен этот момент.

Я рассматриваю вопрос с позиции конечного неискушенного пользователя винды. Я себе это представлял так:

есть некий софт my-app.exe, который зависит от Gtk3. Соответственно, нужен некий https://webpath/to/setup-gtk3.exe инсталятор (набор dll), Скачал инталятор, проинсталировал и my-app.exe можно запустить.

nvl ★★ ()
Ответ на: комментарий от ArkaDOSik

Но может ли кто-нибудь оьъяснить зачем в Qt5 приложении под виндой OpenGL?

Да. Я могу.

У разжиревшего Qt 5 в зависимостях к модулю QtGui обязателен OpenGL, даже если приложение никакой OpenGL и не использует. Эта зависимость не только под виндой, но и под Linux'ом и (наверное) macOS. И точно так же, под Linux'ом приложения на Qt 5 не используют OpenGL, но от него зависят. Лулз-тред на ЛОРе, с обсуждением сего: qt 5.3 и qt 5.5 (комментарий)

Зависимость QtGui от OpenGL была сделана для таких вот специфичных трюков, которые описываются, например, здесь:

http://doc.qt.io/qt-5/qopenglwindow.html

А пример использования в реальных приложениях можно посмотреть здесь:

https://habr.com/post/272423/

---

Далее, отвечаю на вопрос, зачем нужна библиотека opengl32sw.dll для приложений на Qt 5?

Суть в том, что в любой MS Windows в стандартной поставке «из-коробки» используется старейший OpenGL 1.1 родом из 1997 года:

PPSSPP 1.0 (комментарий)

А Qt 5 работает лишь c OpenGL >= 2.1

Поэтому, если приложение всё-таки использует OpenGL, то алгоритм подгрузки либ, согласно официально документации, получается следующий:

1. Проверяется библиотека opengl32.dll

Если эта библиотека в вашей ОС поставляется vendor'ом вашего GPU (AMD, NVidia, Intel) и имеет реализацию OpenGL 2.1, то она и будет использоваться без каких-либо ограничений. Это множество включает в себя большинство случаев и компьютеров.

Если же opengl32.dll в системе это дефолтная реализация OpenGL от MS Windows, родом из 1997 года, то значит требуется перейти к шагу №2. Этот случай повсеместно встречается в офисных компах «без видеокарты» или же ноутбуках с Intel GPU, где забили на реализацию OpenGL под MS Windows или она косячная.

2. Проверяется возможность работы через ANGLE

Итак, если ваша реализация OpenGL в системе оставляет желать лучшего, то Qt 5 пытается заюзать костыль под называнием ANGLE. Его суть в том, чтобы все вызовы OpenGL или OpenGL ES транслируются в вызовы DirectX. Библиотека ANGLE изначально была разработана Google для браузера Chrome для аналогичных целей.

В случае если ANGLE по каким-либо причинам использовать не получается, то переходим к шагу №3. Причин таких может быть несколько: видеокарта не поддерживает DirectX 9.0c, отсутствуют библиотеки ANGLE и DirectX в поставке с приложением, и т. д.

3. Fallback-режим: использование opengl32sw.dll

Если все проверки на OpenGL/DirectX зафейлились, то приложение переходит к использованию библиотеки opengl32sw.dll аля LLVMPipe. Её суть в реализации OpenGL на мощностях не GPU, а CPU. Медленно, зато будет работать.

Вот такие пироги. Зачем всё это приложению на Qt 5 с двумя кнопками — остаётся загадкой. Но видимо утилита windeployqt считает, что так и нужно.

P.S. Отвязать модуль QtGui от OpenGL можно лишь пересборкой всего Qt с флажком -disable-opengl. Однако во всех стандартных бинарных сборках для MS Windows и Linux эта фича активирована по умолчанию.

Как решение — если приложение точно не использует модули зависящие от OpenGL или не использует OpenGL из QtGui; и не планирует, то можно забить на все эти доп. либы аля ANGLE и opengl32sw.dll и тупо их вырезать. Места освободится много, а функциональность нарушена не будет.

EXL ★★★★★ ()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от nvl

С позиции конечного неискушённого пользователя винды тебе вообще не нужно знать об GTK+3.

Эта задача не входит в end-user'ские. Когда ты устанавливаешь GIMP или Inkscape в винду, ты греешь голову мыслями о GTK+? Или когда устанавливаешь какое-нибудь приложение на Qt 5, вроде IDA Pro, ты что, устанавливаешь Qt?

Для тебя, как для end-user'а, этот GTK+ будет распространяться вместе с программой нужной и оттестированной версии. Вместе со всеми его зависимостями. И вместе с другими зависимостями самой программы.

EXL ★★★★★ ()
Последнее исправление: EXL (всего исправлений: 2)
Ответ на: комментарий от EXL

Понял, спасибо. Как обычно - винда весит гораздо больше, чем почти любой Linux дистрибутив, а в базовой поставке даже OpenGL нормального нет. Они даже DirectX свой родной по-моему только в 8 включили, до этого надо было ставить.

ArkaDOSik ()
Ответ на: комментарий от hobbit

всё равно пока выкладываю с 4.8.6

А почему не 4.8.7? У меня где-то была скомпиленная сборка Qt этой версии, валяющаяся на сервере под Ubuntu с MinGW-w64. Если что, могу дать доступ для сборки. Или у тебя там используется компилятор от MS Visual Studio?

Проблема с Qt 4 — отсутствие поддержки HiDPI экранов. В случае с Qt 5, насколько я помню, достаточно пересобрать приложение и выставить ему необходимый новый атрибут:

https://github.com/EXLMOTODEV/coolreader/commit/20c16aa4d8aee40227dab3e72ae12...

Это для того, чтобы скейлилось не виндой и мыльно, а самим фреймворком Qt.

EXL ★★★★★ ()
Ответ на: комментарий от EXL

Когда ты устанавливаешь GIMP или Inkscape в винду, ты греешь голову мыслями о GTK+?

Лет 10 назад, для установки GIMP нужно было установить Gtk. Вроде была инструкция, что-то вроде «прежде установите Gtk+ отсюда (и ссылка на инсталятор)»

nvl ★★ ()
Ответ на: комментарий от RazrFalcon

Отлично. Ничего не понимаем - но выводы делаем.

Ну если это оно:

https://github.com/GDKsoftware/win32diskimager/tree/master/src

То ему нахер этот OpenGL не нужен. Однако, по всей видимости windeployqt в разжиревший Qt 5 его радостно притянул. И все решили (разраб в том числе) что «это норма» (с) и наложили в релиз ненужных либ.

EXL ★★★★★ ()
Ответ на: комментарий от RazrFalcon

А подробнее? Вряд ли модератор полезет в доки Qt. Да и вообще написано, что ее можно удалить. Как уже написали, эта либа на 15 МБ нужна для винды без графического драйвера, тогда интерфейс рисуется процессором. Хм, интересно было бы погонять какое-нибудь GTK приложение в таком режиме, запустится ли?

ArkaDOSik ()
Ответ на: комментарий от ArkaDOSik

Вряд ли модератор полезет в доки Qt.

Какой ещё модератор?

Как уже написали, эта либа на 15 МБ нужна для винды без графического драйвера, тогда интерфейс рисуется процессором.

Это чушь. QtWidgets по умолчанию работает на проце.

RazrFalcon ★★★★★ ()
Последнее исправление: RazrFalcon (всего исправлений: 1)

Tl;dr.

Приложение на gtk под windows запусти тогда, когда у тебя активная раскладка не английская. Получи неработающие хоткеи, в т.ч банальный ctrl+c/ctrl+v. Багу 100500 лет. В qt такого нет. Дальнейшее рассмотрение гтк как кросслатформенного гуя просто нелецелесообразно.

nev3rfail ()