LINUX.ORG.RU

Что менее монструозное в 2020 как библиотека: Qt или GTK для C++ разработки чисто под linux?

 


3

4

Есть старый C++ GUI сделанный в 2012. Собирался под win и linux. Поддерживать win надоело, сам её не юзаю, да и мастдай уже произошёл. Qt была выбрана по совету знакомых как супермегапростая штука. Хотя юзал из всего набора минимум - окна, кнопки и иконки.

Глядя на сегодняшний мир всяких убунт, мы видим что GTK как-то более распространён (или так только кажется)? Никакого Qt в базовых интерфейсах, никаких KDE и прочего говнища.

Гуй требует переработки, код написан слишком давно, выглядит лохмато, без современных стандартов и т.п. Всё равно много перекапывать.

Так чё, на GTK всё переписать, чтобы быть в тренде и меньше гимора в дальнейшем? К тому же, никогда не нравились всякие эти ненативные приблуды в Qt вроде MOC или как там его. Хочется что-то ламоповое без cmake, минималистичное, быстрое, современное и самое трендовое. Поддержики всякого JS-кода в интерфейсах, звука, воспроизведения видосов не требуется (есть вывод звука, но там на ALSA всё руками сделано по-пацански).



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

Сишечка не котируется. Сделать то можно, но не будет статической типизации и проверок в compile-time. Нет шаблонов, а значит будут портянки, макросы и каст туда сюда в void*. Говнокодить в рантайме можно и на жабоскрипте или ruby. Не убедил.

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

так я и не убеждаю писать на сишечке. я утверждаю, что кресты еще ущербнее, т.к. в них кроме ущербной и бесполезной объектной системы ничего нет - остается та же сишечка.

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

Говнокодить в рантайме можно и на жабоскрипте или ruby.

плохой пример на самом деле. плохо стараешься. есть и компилируемые языки с нормальным рантаймом, типо-безопасностью и адекватной объектной системой.

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

Стабильный ABI результат не каких-то особых усилий архитекторов сишечки. Просто она анскильная. В ней нет хитрых штук, которые потребовали бы сложный ABI. За всю свою историю сишечка так и не обросла фичами. А тот немногий синтаксический сахар, что появился, не требует вмешательства в ABI. Не убедил.

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

Стабильный ABI результат не каких-то особых усилий архитекторов сишечки. Просто она анскильная.

хрень собачья. вон в кланге люди напряглись, и запилили стабильный ABI для свифт. но ты конечно скажешь что кресты 4ever, а свифт недоязычок, т.к. кроме крестов видимо ничего не грыз.

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

Примеры в студию, пожалуйста. Надеюсь, эти языки прошли проверку продакшеном и широко используются? Нишевые хипстерские язычки по типу растишки не в счёт. Лиса, которая занимает 3% (или сколько там) браузерного рынка не считается. Вот когда линукс на нём перепишут, тогда и поговорим.

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

Примеры в студию, пожалуйста.

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

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

о каком конкретно коде на C++ идет речь?

class DataIO
{
public:
	virtual size_t Read(char *data, size_t size) = 0;
	virtual size_t Write(const char *data, size_t size) = 0;
}

class StreamIO
{
private:
	FILE *fStream;
	
public:
	StreamIO(FILE *stream): fStream(stream) {}
	
	size_t Read(char *data, size_t size) override
	{
		return fread(data, 1, size, fStream);
	}
	
	size_t Write(const char *data, size_t size) override
	{
		return fwrite(data, 1, size, fStream);
	}
}

void Do(DataIO &io)
{
	const char *str = "This is a test";
	io.Write(str, strlen(str)); // DataIO приводится к StreamIO без dynamic_cast
}

int main()
{
	StreamIO io(stdout);
	Do(io);
	return 0;
}
X512 ★★★★★
()
Ответ на: комментарий от waker

swift

Появился в 2014. Если бы они не осилили стабильный ABI, то это было странно. Кресты по старше будут.

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

то, что твой пример кастует char * в void * неявно, я так понимаю не считается? где в этом примере вообще наследование?

// DataIO приводится к StreamIO без dynamic_cast

не приводится, видимо ты где-то напортачил, и типо-безопасность не спасла. DataIO и StreamIO в этом примере не наследуют вообще ничего.

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

Появился в 2014. Если бы они не осилили стабильный ABI, то это было странно. Кресты по старше будут.

где логика? ах да, крестовики…

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

это создание объектов, обыкновенная фабрика. я написал классов. разница вообще-то есть :D

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

Ну вот не надо про ущербность. Нормальное там ООП. Не идеальное в академическом смысле, но вполне подходит для решения поставленных задач. Метапрограммирование. В крестах есть метапрограммирование. Я сейчас пилю один проект и меня это очень спасает. Без этого пришлось бы писать кучу лишнего кода. С шаблончиками всё выглядит красиво и компактно.

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

В крестах есть метапрограммирование.

у крестового метапрограммирования есть фатальный недостаток.. 1 файл компилируется несколько минут, и никто не может понять что в нем написано (true story)

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

то, что твой пример кастует char * в void * неявно, я так понимаю не считается?

Не считается. Это взаимодействие с API библиотеки и к ООП отношения не имеет.

где в этом примере вообще наследование?

Выше исправлено.

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

про твой пример с автоматическим приведением типа: да, в си этого не будет. будет аналог dynamic cast. опять же, с поправкой на то, что никто в здравом уме не будет делать на си ущербную объектную систему похожую на кресты, в которой преобразование типа объекта это каст указателя. если эмулировать кресты - будут касты указателей, естественно.

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

Не считается. Это взаимодействие с API библиотеки и к ООП отношения не имеет.

а выше кто-то писал, что можно на крестах писать код без кастов указателей вообще. вы там разберитесь между собой…

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

Без этого пришлось бы писать кучу лишнего кода. С шаблончиками всё выглядит красиво и компактно.

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

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

с поправкой на то, что никто в здравом уме не будет делать на си ущербную объектную систему похожую на кресты

А как будут? Покажи как правильно.

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

То есть любители Си ещё и агрессию контролировать не умеют. Надеюсь, что полиция найдёт их и посадит (УК РФ Статья 116).

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

А как будут? Покажи как правильно.

из готового можно посмотреть на рантайм objective c - какая-то дремучая реализация наверняка есть в опенсорсе, и ее вполне хватит, чтобы оценить средневековость крестов, например.

написано на си, и повторить нечто подобное очень просто.

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

То есть любители Си ещё и агрессию контролировать не умеют. Надеюсь, что полиция найдёт их и посадит (УК РФ Статья 116).

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

ах да.. на крестах я тоже пишу. по работе приходится (хоть и редко в последние 10 лет).

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

Надеюсь, что полиция найдёт их и посадит (УК РФ Статья 116).

надеюсь, с возрастом детектор сарказма прокачается.

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

угу. кстати, еще один прелестный пример – возможность изменения класса у объекта прямо на лету :D

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

кстати, всякие скалочки с жабочками и шарпиками я умышленно пропускал, т.к. будет нечестное сравнение. они таки не совсем (или совсем не?) компилируемые. там есть всякий JIT и даже иногда своеобразный AoT, но они не так интересны в контексте сравнения с крестами.

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

пора спать, поэтому добавлю «last but not least».

многие наверное подумают «а нахрен все это надо – манки-патчинги/свиззлинги эти ваши, и создание классов в рантайме – изврат же!»

у этого, как ни парадоксально, есть практическое применение – диагностика, отладка и создание mock-классов. такое даже в адекватных языках не везде доступно. а в крестах и подавно. можно конечно обойти костылями, но на то они и костыли.

waker ★★★★★
()

Не уходи с Qt. Простая, на все случаи жизни. при необходимости в будущем сможешь легко опять для винды сборку сделать.

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

создание классов в рантайме – изврат же

Конечно изврат. Если хочется большего изврата, то можно генерировать код па C++, вызывать компилятор и динамически загружать полученный результат. Можно даже библиотеку для всего этого сделать.

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

Конечно изврат. Если хочется большего изврата, то можно генерировать код па C++, вызывать компилятор и динамически загружать полученный результат.

именно это и делают при использовании языков с менее продвинутыми объектными системами – попадает в категорию костылей.

Можно даже библиотеку для всего этого сделать.

библиотеку – это само собой. mocking frameworks как бы и есть библиотеки. они либо в рантайме делают, если есть технические средства (обычно для языков исполняемых в VM), либо код генерируют (кресты и свифт типично).

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

о, мне еще один «изврат» вспомнился, хотя по большому счету это рефлексия… которая уже упоминалась. можно обращаться к классам или например вызывать методы по именам (из строк). очень забавные архитектуры получаются. но на самом деле очень полезная фича для прикрутки гуя к коду. ее кстати Qt и Glade как раз костылят кодогенерацией :) точнее, новый глейд уже умеет и без костылинга, но раньше так было.

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

Хотя юзал из всего набора минимум - окна, кнопки и иконки.

Ну и расскажи как в приложение добавить иконку в интерфейс (не на кнопку) QPixmap такую чтобы она была DPI Aware из SVG файла.

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

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

1 файл компилируется несколько минут

Это не баг, это фича. Можно сгонять чай попить. Компилируется же.

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

Ерунда, все что угодно можно написать адекватно и без шаблонов. Например, можно адекватно написать кодогенерацию, будет и код понятный, и во время компиляции - как и метапрограммирование, и не придется ждать пока компилятор шаблоны распарсит.

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

Судя по твоим продемонстрированным знаниям, рановато такими доводами про неосиляторство разбрасываться.

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

Вот именно что QIcon(":/file.svg").pixmap(64, 64) вернет QPixmap DPI Aware 128px для QT_SCALE_FACTOR=2. А сам QPixmap ничего не знает про DPI, хотя попытки запихать в него были аж в Qt 4.7 но забросили. Тащить QSvgWidget как картинку в интерфейс это через чур, его и рисовать нужно вручную.

bhfq ★★★★★
()

Нынче в моде электорн и прочая веб мазня. А так как Qt содержит QML, то Qt предпочтительнее.

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

Ну и пусть. Будет форк кути и кутя в виде форка наконец-то станет нормально развиваться.

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

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

ЗЫ

C# и Java (про последнюю я не сильно уверен, так как ничего серьёзного на ней не делал) в плане удобства и логичности, а также «правильности и крутости» языка порвут и C++ и C с растишкой, но, к сожалению, заменить их не смогут по понятным причинам в виде стековой машины.

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

они таки не совсем (или совсем не?) компилируемые

Очень даже компилируемые, чем байт-код JVM принципиально отличается от любого другого набора команд?

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

как минимум тем, что в нем нет инструкций для работы с памятью/указателями, зато есть инструкции для создания объектов и вызова методов :)

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