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

Кажется, у многих людей есть мнение о том, что лучше. На самом деле я не спрашиваю эти мнения, я хотел бы знать подробности: чем один графический инструментарий отличается от другого, и какие из этих различий есть у Qt и Gtk+?


person Matthew    schedule 26.11.2009    source источник


Ответы (3)


Я не могу говорить напрямую с Gtk+, но на предыдущей работе я использовал Gtkmm, а на нынешней работе использую Qt. Оба написаны на C++, поэтому в этом отношении они совместимы, но Gtkmm является/был лишь оболочкой для кода Gtk+, который находится на чистом C.

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

Отладка с помощью Gtkmm была немного мучительной, потому что классы, как правило, ничего не делали, кроме хранения указателя на структуру и вызова функций Gtk+. Этот дополнительный уровень косвенности может раздражать.

Qt имеет больше вспомогательного кода, который может быть полезен в различных настройках, по крайней мере, по сравнению с версией Gtkmm, которую я использовал. Вещи, которые упрощают многопоточность, взаимодействие между процессами и работу в сети, ценятся, когда вам нужно добавить новое измерение в вашу программу. У них также есть свои контейнеры, если вы хотите их использовать, которые, я думаю, имеют более разумный интерфейс, чем контейнеры STL, но в конце концов они делают примерно то же самое, так что это небольшое преимущество.

Механизм сигнала/слота между Gtkmm и Qt отличается. Qt полагается на дополнительный шаг в процессе компиляции для генерации метаинформации, которую он использует для своих сигналов/слотов. Объект, использующий сигналы или слоты, должен наследовать от QObject, и наследование QObject должно быть первым, без ромбовидной структуры. Это затрудняет, например, определение абстрактного интерфейса, который излучает сигнал. Положительным моментом является то, что они изначально осведомлены о проблемах с многопоточностью и при необходимости преобразуют соединение сигнал/слот в соединение на основе событий. Gtkmm использует сигналы SigC, которые представляют собой простые классы C++, и мне кажется, что они полезны в самых разных ситуациях. Кроме того, насколько я помню, только объекты, которые создают соединение, должны наследоваться от базового класса magic. Кроме того, поскольку слоты являются объектами, вы также можете использовать их как очень удобные адаптируемые функторные объекты.

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

person Caleb Huitt - cjhuitt    schedule 26.11.2009

Чтобы понять различия, лучше всего понять историю.

QT был разработан как пользовательский интерфейс и имел некоторые проблемы с лицензированием в начале разработки KDE. KDE выбрал QT, так как тогда не было большого выбора (Motif, Tcl/Tk и другие)

GIMP начал разрабатываться, и в то время Window Toolkit не соответствовали требованиям разработчиков, поэтому они начали писать Gimp Tool Kit (GTK). Через некоторое время было решено переписать GTK и сделать его объектно-ориентированным (GTK+).

Примерно в это же время из-за потенциальных проблем с лицензированием QT был запущен Gnome, и было решено использовать библиотеку GTK+.

Теперь, если вы посмотрите на Дизайн QT и GTK Design в Википедии, вы можете увидеть некоторые различия между системами.

Обратите внимание, что QT упоминается как :

кроссплатформенная среда разработки приложений

в то время как GTK+ упоминается как:

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

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

person Wayne    schedule 26.11.2009
comment
Это не совсем разница. Это просто означает, что GTK делает основные вещи с отдельными библиотеками (glib, GObject и т. д.), в то время как у Qt есть все в QtCore. Более близкое сравнение будет QtGui против GTK. - person György Andrasek; 26.11.2009
comment
Еще одна историческая проблема при рассмотрении кросс-платформенных возможностей заключается в том, что это учитывалось с самой первой исходной строки Qt, тогда как GTK с самого начала разрабатывался как инструментарий X11, а затем был расширен до чего-то вроде кросс-платформенности. Платформа позже. Наличие нескольких библиотек для разных вещей действительно может сделать кросс-платформу проблемой, поэтому Qt — мой предпочтительный выбор. - person e8johan; 27.11.2009

Прежде всего, вы можете использовать Gtk+ из C. Qt — это только C++.

Кроме того, в приложениях Gtk+ постоянно меняются диалоги с кнопкой закрытия. Qt работает по принципу Ok/Apply/Cancel. Однако я не знаю, насколько это реализовано на уровне набора инструментов.

Что касается программирования, я не знаю, какой механизм обратного вызова использует Gtk, но механизм сигналов-слотов Qt абсолютно крут.

person György Andrasek    schedule 26.11.2009
comment
Я слышал это раньше (что Qt — это только C++), но я действительно не понимаю, что это значит. Я могу использовать Gtk+ в C#, python и т. д. Я знаю, что вы можете использовать Qt как минимум в python. Что означает, что Qt — это только C++? - person Matthew; 26.11.2009
comment
@Matthew: это просто означает, что вы не можете использовать его с C. Однако вы можете сделать привязку к любому языку более высокого уровня (Python, Ruby и т. д.). - person Sasha Chedygov; 26.11.2009
comment
Автоматическое сохранение настроек по сравнению с OK, Apply, Cancel на самом деле больше похоже на Gnome, чем на KDE. Оба набора инструментов могут справиться с любым из них. - person Parker Coates; 26.11.2009
comment
Qt — это только С++. Это неверно. Потому что Qt поддерживает множество языков программирования. - person kien bui; 18.11.2018