Gtk+和Qt有什么区别?

24
很多人似乎对哪个更好有自己的看法。我并不是在询问这些意见,我想知道的是细节:是什么使得一个图形工具包与另一个不同,Qt和Gtk +之间有哪些区别?
3个回答

28

我不能直接谈论Gtk+,但在以前的工作中我使用了Gtkmm,在当前的工作中我使用Qt。两者都是C++,所以在这方面它们是一致的,但Gtkmm只是对Gtk+代码的包装,而Gtk+的代码是直接用C编写的。

在我换工作时,我记得两个工具包在UI代码方面的主要区别是它们如何处理布局。有些部分我认为Gtk做得更好,有些部分我认为Qt做得更好。但最终它们都可以让您把小部件放到您想要的地方。

使用Gtkmm进行调试有点麻烦,因为类通常除了保存一个指向结构体的指针并调用Gtk+函数之外什么也不做。这种额外的间接性可能很烦人。

与我使用的版本的Gtkmm相比,Qt具有更多的辅助代码,可以在各种环境中发挥作用。当您需要为程序添加新的维度时,可以方便地处理线程、进程间通信和网络。此外,它们还拥有自己的容器,如果您想使用它们,它们的接口比STL容器更合理-但它们最终做的事情相同,所以这只是一个轻微的优势。

Gtkmm和Qt之间的信号/槽机制是不同的。Qt依赖于编译过程中的额外步骤来生成元信息,它用于其信号/槽。使用信号或槽的对象必须继承自QObject,并且QObject继承必须是第一个,没有钻石结构。例如,定义发出信号的抽象接口就很困难。好处是,它们在本质上意识到线程问题,并在必要时将信号/槽连接转换为基于事件的连接。Gtkmm使用SigC信号,这是直接的C++类,在我看来,在更广泛的情况下很有用。此外,只有建立连接的对象需要继承魔术基类,据我所记得。另外,由于槽是对象,因此您还可以将它们用作非常好的可适应的函数对象。

我相信还有其他的差异,但这是我现在记得的。请记住,我上一次使用Gtkmm是大约3年前,所以其中一些内容可能已经发生了变化。


19
为了理解差异,最好先了解历史。QT 最初作为 UI 开发,一开始 KDE 开发时存在一些许可问题。当时选择 QT 是因为没有太多选择(例如 Motif、Tcl/Tk)。同时,GIMP 开始开发,当时的窗口工具包不符合开发者的需求,因此他们开始编写 Gimp 工具包(GTK)。经过一段时间后,决定重新编写 GTK 并使其面向对象(GTK+)。同时,由于 QT 可能存在潜在的许可问题,Gnome 开始并决定使用 GTK+ 库。现在,如果您查看维基百科上的 QT DesignGTK Design 条目,就可以开始看到这些系统之间的一些差异。请注意,QT 被称为:

跨平台应用程序开发框架

而 GTK+ 被称为:

用于创建图形用户界面的跨平台小部件工具包。

如果这些条目是可信的,那么我认为这就是两者之间的主要区别,但在今天的世界中,这是一个相当微妙的界限。


5
这并不是真正的区别。它仅意味着GTK使用单独的库(如glib,GObject等)进行基本操作,而Qt则将所有内容都包含在QtCore中。更近似的比较应该是QtGui与GTK。 - György Andrasek
6
在考虑跨平台能力时,另一个历史问题是从Qt的第一行源代码就考虑了这一点,而GTK最初是作为X11工具包设计的,后来才被扩展成类似于跨平台的东西。拥有多个库处理不同的事情可能会让跨平台变得很麻烦,这就是为什么我在这里更喜欢选择Qt的原因。 - e8johan
我想更多地了解使用这些框架的一些影响。例如,GTK应用程序倾向于使用gsettings和dconf,这需要运行一个服务。 - NeilG

6

首先,你可以使用C语言来使用Gtk+。而Qt则只能使用C++。

此外,Gtk+应用程序往往具有可以持续更改的对话框,带有关闭按钮。而Qt则倾向于采用Ok/Apply/Cancel这样的方式。虽然我不知道这在工具包级别上强制执行了多少。

至于编程方面,我不知道Gtk使用什么回调机制,但是Qt的信号槽机制绝对非常好用。


我之前听说过(Qt 只支持 C++),但我并不真正理解它的含义。我可以在 C#、Python 等语言中使用 Gtk+。我知道至少可以在 Python 中使用 Qt。Qt 只支持 C++ 是什么意思? - Matthew
3
@Matthew:这意味着你不能在C语言中使用它。但是,你可以将其绑定到任何高级语言(如Python、Ruby等)。 - Sasha Chedygov
6
“自动保存设置”与“确认、应用、取消”更多地是Gnome和KDE之间的区别。两种工具包都可以处理这两种方式。 - Parker Coates
Qt 不仅支持 C++,还支持许多其他编程语言。因此说 Qt 只是 C++ 是错误的。 - kien bui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接