Кажется, у многих людей есть мнение о том, что лучше. На самом деле я не спрашиваю эти мнения, я хотел бы знать подробности: чем один графический инструментарий отличается от другого, и какие из этих различий есть у Qt и Gtk+?
В чем разница между Gtk+ и Qt?
Ответы (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 лет назад, так что некоторые из этих пунктов могли уже измениться.
Чтобы понять различия, лучше всего понять историю.
QT был разработан как пользовательский интерфейс и имел некоторые проблемы с лицензированием в начале разработки KDE. KDE выбрал QT, так как тогда не было большого выбора (Motif, Tcl/Tk и другие)
GIMP начал разрабатываться, и в то время Window Toolkit не соответствовали требованиям разработчиков, поэтому они начали писать Gimp Tool Kit (GTK). Через некоторое время было решено переписать GTK и сделать его объектно-ориентированным (GTK+).
Примерно в это же время из-за потенциальных проблем с лицензированием QT был запущен Gnome, и было решено использовать библиотеку GTK+.
Теперь, если вы посмотрите на Дизайн QT и GTK Design в Википедии, вы можете увидеть некоторые различия между системами.
Обратите внимание, что QT упоминается как :
кроссплатформенная среда разработки приложений
в то время как GTK+ упоминается как:
кроссплатформенный инструментарий виджетов для создания графических пользовательских интерфейсов.
Если верить этим записям, то я думаю, что это основные различия между ними, но я бы сказал, что это довольно тонкая грань в сегодняшнем мире.
Прежде всего, вы можете использовать Gtk+ из C. Qt — это только C++.
Кроме того, в приложениях Gtk+ постоянно меняются диалоги с кнопкой закрытия. Qt работает по принципу Ok/Apply/Cancel. Однако я не знаю, насколько это реализовано на уровне набора инструментов.
Что касается программирования, я не знаю, какой механизм обратного вызова использует Gtk, но механизм сигналов-слотов Qt абсолютно крут.