我不能直接谈论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年前,所以其中一些内容可能已经发生了变化。
跨平台应用程序开发框架
而 GTK+ 被称为:
用于创建图形用户界面的跨平台小部件工具包。
如果这些条目是可信的,那么我认为这就是两者之间的主要区别,但在今天的世界中,这是一个相当微妙的界限。
首先,你可以使用C语言来使用Gtk+。而Qt则只能使用C++。
此外,Gtk+应用程序往往具有可以持续更改的对话框,带有关闭按钮。而Qt则倾向于采用Ok/Apply/Cancel这样的方式。虽然我不知道这在工具包级别上强制执行了多少。
至于编程方面,我不知道Gtk使用什么回调机制,但是Qt的信号槽机制绝对非常好用。