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

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

Так, как это сделано здесь: https://github.com/jhekasoft/insteadman3 Это приложение на Go, посмотрите в Releases сборку под винду. Просто лучше один раз показать на примере. P.S. Весит все это дело 43 МБ. Так что если запаковать-перепаковать, то можно достигнуть этих 12 МБ, как в этом вашем Image Writer

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

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

Речь не про QtWidgets, он не зависит от OpenGL, а про QtGui.

Он тоже не зависит.

Ну даже не знаю, кому тут верить. Своим глазам:

http://doc.qt.io/qt-5/qtgui-module.html

The Qt GUI module provides classes for windowing system integration, event handling, OpenGL and OpenGL ES integration, Vulkan integration, 2D graphics, imaging, fonts and typography. These classes are used internally by Qt's user interface technologies and can also be used directly, for instance to write applications using low-level OpenGL ES graphics APIs.

$ ldd /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5.5.1  | grep GL
        libGL.so.1 => /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 (0x00007fd2119f2000)

Или тебе.

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

Получи неработающие хоткеи, в т.ч банальный ctrl+c/ctrl+v...

Это если обрабатывается keysym. В случае с keycode все будет работать.

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

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

Сейчас GIMP поставляется вместе с библиотеками GTK+

Так можно ли содержимое /mingw64/bin/ из http://repo.msys2.org/mingw/x86_64/mingw-w64-x86_64-gtk3-3.24.1-1-any.pkg.tar.xz распаковать куда-то в винде и использовать эти библиотеки для бинарного gtk3-приложения (не пакуя их вместе)?

Да. Только к содержимому из этого пакета ещё следует добавить содержимое из тех пакетов, от которых этот GTK+3 зависит. Рекурсивно, естественно.

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

Это к gtk+2 относится, если что. Неужели в gtk+3 починили?

Вроде как и в GTK+2 починили тоже. В последних версиях GIMP'а этот баг исчез. А он ведь до сих пор на GTK+2.

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

Это опциональная, динамическая зависимость.

У меня есть сборки проги под винду, линукс и мак и нигде opengl или QtGl я с собой не тягаю.

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

Это опциональная, динамическая зависимость.

Я знаю. Но на винде OpenGL в любом случае подгружается, вне зависимости от того используешь ты его или нет:

https://github.com/qt/qtbase/blob/a8a0dffd1f78d27c04cfd1e20563e9ddda4a135c/sr...

У меня есть сборки проги под винду, линукс и мак и нигде opengl или QtGl я с собой не тягаю.

А теперь прочитай последний абзац того поста, на который ты радостно повесил 4.2

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

Ух ты, не знал. А то мне даже виндузятников иногда жалко, когда поиск подсказывает «gimp скачать бесплатно для windows». При текущей ситуации любой школьник может встроить в тот же gimp майнер и распространять его на своем говносайте, который попадет в выдачу Яндекса.

Желаю удачи проекту, на linux мне уже нравится, даже думаю поставить Debian 9 для стабильности и пользоваться софтом с flatpak.

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

Не, я всё собираю MinGW.

Думаю, переход на Qt5 у меня свершится естественным образом, как только я приколочусь гвоздями к брусчатке модулю QtNetworkAuth.

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

И да, ОК, ты разобрался. А вот разработчики этого Win32 Disk Imager не разобрались. И на радостях тягают с собой как ANGLE:

  • D3Dcompiler_47.dll
  • libEGL.dll
  • libGLESV2.dll

Так и LLVMPipe:

  • opengl32sw.dll

Все те мегабайты, которые заботливо сложил им windeployqt «на будущее». Никакое OpenGL, они, конечно, не используют. Но либы тянут.

Если человек не понимает что делает - это не проблемы Qt.

Нет уж, это типичные проблемы Qt 5. Разжирели? Разжирели. Деплой усложнили настолько, что чтобы разобраться нужно читать теперь талмуды? Усложнили. Утилит кривых понаделали, которые доп. либы пихают, даже если они не используются? Понаделали.

И сколько ещё таких же разрабов как автор этого Win32 Disk Imager? Да море их. Небось и QBittorent тянет ANGLE и LLVMPipe.

EXL ★★★★★
()

А оно не может цеплять из ВинАПИ?

Потому что я пишу на ГТК2, там нету вендоподобного. Всё как раз очень гткшно.

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

Проще наверное дождаться Flatpak for Windows

Тебе как end-user'у ничего ждать вообще не надо. Твоя задача потребовать с разработчика такой дистрибутив программы, который будет уже с GTK+3 и запустится без всяких свистоплясок.

GTK+3 это сторонняя библиотека. Требовать её наличие в экосистеме Windows где-либо за пределами дистрибутива программы довольно странно. Ты хочешь её в условный system32 закинуть что ли и удалить из GTK-шных дистров различного ПО? Так сделать, конечно, можно. Вот только один разраб гарантирует работу своей программы с одной версией GTK+, а другой — с отличной от неё. И приложения на отличных от протестированных версиях либ могут крэшится или вовсе не запускаться. Эта проблема в винде называется DLL Hell. Её костыльное решение — загружать либы сперва из каталога дистрибутива программы, а потом уже из системного.

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

Речь шла о размере сборки. И это никак на неё не влияет, так как используется или системная либа, или никакая.

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

Нет уж, это типичные проблемы Qt 5. Разжирели? Разжирели.

Нет.

Деплой усложнили настолько, что чтобы разобраться нужно читать теперь талмуды?

Ничего сложного там нет. Как минимум не сложнее плюсов, на которых приходится писать.

Усложнили.

Для одноклеточных - да.

И сколько ещё таких же разрабов как автор этого Win32 Disk Imager?

Да мне фиолетово.

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

Вот только один разраб гарантирует работу своей программы с одной версией GTK+, а другой — с отличной от неё.

любой gtk3-софт должен работать на 3.24.

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

Деплой усложнили настолько, что чтобы разобраться нужно читать теперь талмуды?

Блин, похоже dllки скопипастить проще)) А может простенькую прогу написать, чтобы копировала сама? Там в GTK+ по-моему «лишних» библиотек не так много... Вот например WebKitGTK+ придется отдельно закидывать точно.

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

+ Это как виндузятникам говорить «пользуйтесь линуксом, а если что глючит - мне пох. Но пользуйтесь»

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

Речь шла о размере сборки. И это никак на неё не влияет, так как используется или системная либа, или никакая

В дефолте windeployqt раздувает размер сборки в несколько раз и кладёт LLVMPipe и ANGLE. А до этого вообще года два QtCore на MS Windows зависел от ICU-либ размером в сумме 30МБ с гаком. Хорошо хоть это зафиксили.

Вот ты для своей программы ручками либы копировал? Или потом выковыривал LLVMPipe и ANGLE из того что тебе windeployqt выплюнул?

Ничего сложного там нет. Как минимум не сложнее плюсов, на которых приходится писать.

Ты споришь с тем, что деплой Qt 5 усложнился в сравнении с Qt 4? Глупо спорить с очевидной реальностью.

В Qt 4 для «типовых» приложений нужно было думать ровно о двух либах: QtCore и QtGui. А тот же OpenGL был вынесен в отдельный модуль.

В Qt 5 теперь нужно думать о куче либ. Во-первых, разбили QtGui на QtGui и QtWidgets, во-вторых imageformats, в-третьих iconengines, в-четвёртых основные плагины платформы — platforms, в-пятых стили — styles. Всё это DLL-ки, которые разворачивает тот же windeployqt. В-шестых теперь вот эта херота с ANGLE и LLVMPipe и в-седьмых (ныне отпавший) icu.

---

Вот взять твоё приложение Svg Cleaner. Ты используешь и бандлишь под винду Qt 5.9.3, а если захочешь тупо взять и обновить Qt, то увидишь, что отпали темы и приложение выглядит like Windows 95. Почему? Потому что снова усложнение деплоя! Начиная с Qt 5.10.x, виндовую поддержку тем вынесли в отдельную либу.

https://github.com/mxe/mxe/issues/2037

И ты должен будешь теперь греть голову ещё и о директории styles с отдельной DLL в дистрибутиве свой программы под MS Windows.

Это ли не постоянный дроч и усложнение деплоя?

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

У меня было в 2, но не сказать, что это все зависимости Qt, лишь все для моего приложения, которое тянуло: QtCore, QtWidget, QtNetwork

SR_team ★★★★★
()

если пишешь гуйню под винду, то бери qt

У Qt кстати меню немного не такое как в WinAPI и в зависимости от темы оно может выглядеть не нативно.

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

windeployqt

Никто не заставляет его использовать. Тем более, что он убогий.

Вот ты для своей программы ручками либы копировал?

У меня есть скрипт, который копирует только то, что нужно.

Ты споришь с тем, что деплой Qt 5 усложнился в сравнении с Qt 4? Глупо спорить с очевидной реальностью.

Тут не с чем спорить. Клепать проги на Qt - моя работа. И никаких проблем с переходом на Qt 5 я не заметил. Всё стало только лучше.

Это ли не постоянный дроч и усложнение деплоя?

Лучше Qt всё равно ничего нет.

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

А может простенькую прогу написать, чтобы копировала сама?

Она и написана, называется windeployqt и идёт в стандартной поставке Qt.

Проблема в том, что разрабы Qt не осилили автоматическое определение того, использует приложение на Qt библиотеку OpenGL или нет. Поэтому ты должен ручками задавать там --no-angle, --no-opengl-sw и т. д.

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

У меня есть скрипт, который копирует только то, что нужно.

То бишь костыль взамен официальной утилиты. Который с переходом на >= Qt 5.10.x ты обязан будешь править, чтобы он разворачивал ещё и директорию styles, если версия Qt больше, чем Qt 5.9.3

Всё стало только лучше. Лучше Qt всё равно ничего нет.

Одно дело использовать, знать и обговаривать недостатки/сложности. Другое — быть фанатиком, слепо верить и оспаривать очевидные проблемы, вредя тому же Qt.

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

Вспомнил, в Fedora Image Writer под виндой папки в его дистрибутиве содержали в названии «Qt5», хотя сама прога на GTK. Наверное там как раз windeployqt заюзали. Ох, сплошные костыли да велосипеды в этой винде, хотя в линуксах тебе надо держать и GTK2, и GTK3, и Qt 5, и Qt4 чтобы вся софтина работала. Так что не понятно, что лучше.

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

То бишь костыль взамен официальной утилиты.

Если он работает лучше - значит не костыль.

Одно дело использовать, знать и обговаривать недостатки/сложности.

Ещё раз: обсуждать нечего. Нужна кроссплатформенная либа - используем Qt. Сравнивать одну либу саму с собой смысла не вижу.

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

Ну это еще один привет из прошлого, когда пиратить игры было проще чем покупать лицензию. Видно для Win10 данная проблема все еще актуальна.

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

Вспомнил, в Fedora Image Writer под виндой папки в его дистрибутиве содержали в названии «Qt5», хотя сама прога на GTK.

Не знаю о каком ПО говоришь, но вот я нашёл репозиторий этой программы и она на Qt 5, а не GTK+:

https://github.com/FedoraQt/MediaWriter

Наверное там как раз windeployqt заюзали.

И правильно сделали. Там он отработал верно: приложение использует QtQuick/QML, а следовательно ему нужны все эти ANGLE и LLVMPipe.

В отличие от той программы, которую ты приводил в пример в первых постах. Она использует лишь QtWidgets и на OpenGL ей класть.

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

А если мне нужна кроссплатформенная либа например для Rust? Пойти отстреливать конечности в C++? Еще на лоре полно любителей Pure C, D всяких. Им же тоже возможно хочется кроссплатформенную гуйню писать. Причем необязательно нужна такая могучая штука как Qt, а просто необходим удобный тулкит с такими приятными фичами, как Glade. По сути сейчас Qt можно полноценно использовать только из C++, Python и QML (JS). А биндингов к GTK+ очень много: https://www.gtk.org/language-bindings.php И многие из них имеют полную поддержку всех функций этого GTK+, как видно. Я вообще этим топиком хотел показать, что кроссплатформенный GUI - это не только Qt.

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

Если он работает лучше - значит не костыль.

Если я сейчас заюзаю твой скрипт на >= Qt 5.10, то получу тыкву приложение без стилей.

Ещё раз: обсуждать нечего.

Как раз есть что.

Благодаря нашим (юзерам, страждущим избавления QtCore от ICU) обсуждениям в багтрекере Qt, ты сейчас в первом сообщении этой темы и можешь написать:

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

В противном случае, без обсуждений, ты бы помалкивал и стыдливо прятал эти 30 МБ с гаком от ICU, которые обязательно линковались к QtCore на MS Windows.

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

Запамятовал, в голове отпечаталось, что там тема а-ля Adwaita, наверное сделали «чтоб как в гноме», который в федоре единственный официальный.

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

Интересно, им кто-нибудь пользуется?

Особого толку нет, ведь поддержка HiDPI там даже не заявлена (?).

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

зачем в Qt5 приложении под виндой OpenGL

действительно странно, у меня dx9 использовался

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

Я вдруг подумал, может это у меня слишком длинный нос. Попытался установить гимп с офф.сайта перепроверить (пиджин точно сломан, а гимп я юзаю раз в три года, может это лично у меня что-то залагало). И он висит. Установщиком. Совсем. После выбора языка ничего не рисует :/ https://pic4a.ru/811/RcV.bmp Я, чисто с точки зрения эндюзера, не понимаю, как такая херня возможна в 2018 году.

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

Либо собрать самому

То еще приключение, учитывая количество зависимостей с поломанными на винде системами сборки.

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

Если я сейчас заюзаю твой скрипт на >= Qt 5.10, то получу тыкву приложение без стилей.

Мой скрипт собирает мою прогу. Он не универсальный.

Как раз есть что.

Жду список. GTK+ и wxWidgets не предлагать.

В противном случае, без обсуждений, ты бы помалкивал и стыдливо прятал эти 30 МБ

Ваше мнение очень важно для нас. (с)

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

Да, актуальная версия Гимпа с офф.сайта на десяточке работает без проблем с копипастом. Пиджин, впрочем, всё ещё сломан.

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

Мой скрипт собирает мою прогу. Он не универсальный.

Следовательно, работает лучше он лишь для случая сборки твоей программы под определённой версией Qt 5. Считать этот скрипт лучше универсальной утилиты windeployqt, пока ещё нет оснований.

Жду список. GTK+ и wxWidgets не предлагать.

Список чего? Таблеток что ли? Ну у врача спроси. Причём тут GTK+ и wxWidgets вообще...

Ваше мнение очень важно для нас. (с)

Как и мне твоё. Я буду продолжать обсуждать недостатки и проблемы Qt 5 на форумах и в багтрекерах, а ты так и будешь продолжать писать посты, подобные первому в этой теме. Посты, которые как раз и зависят от результатов и плодов тех самых обсуждений. Моих в т. ч.

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

И он висит. Установщиком. Совсем. После выбора языка ничего не рисует :/ https://pic4a.ru/811/RcV.bmp Я, чисто с точки зрения эндюзера, не понимаю, как такая херня возможна в 2018 году.

Странно, у меня поставился обновился GIMP этим установщиком с 2.10.2 до 2.10.6 без каких-либо проблем. На всякий случай

cast AP

Да, актуальная версия Гимпа с офф.сайта на десяточке работает без проблем с копипастом.

Так отвисло или заново перезапустил установку?

Пиджин, впрочем, всё ещё сломан.

Интересно, если GTK-либу взять из GIMP'а, поможет ли это? :) Хотя Pidgin вроде на GTK+3.

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

Вот от того, что в Qt стали пихать все подряд и он стал огромным комбайном с разными фичами его признают многие диалектом C++ и поэтому к нему крайне тяжело делать биндинги. А у GTK gobject-introsception. Да и вообще цель тулкита - выводить окошки с кнопочками, а остальное я могу сделать как угодно, хоть взять какую-нибудь библиотеку для моего языка, хоть написать свой биндинг к библиотеке на C. Но C++ не умрет никогда, как не умер C. И поэтому Qt будет жить всегда и решать намного больше задач, чем решает тулкит. Без фанатизма, Qt хорош, но ограничен в количестве языков. У GTK много языков, о это просто тулкит. Хотя ИМХО функции тулкита он выполняет.

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

поэтому к нему крайне тяжело делать биндинги

Нет. Проблема в C++.

Вот от того, что в Qt стали пихать все подряд

Что лишнего в QtCore/Gui/Widgets? Всё остальное опционально, если что.

У GTK много языков, о это просто тулкит.

Только его никто не использует. Интересно почему?

RazrFalcon ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.