【问题标题】:What are the differences between Gtk+ and Qt?Gtk+ 和 Qt 有什么区别?
【发布时间】:2010-12-20 12:58:05
【问题描述】:

很多人似乎对哪个更好有意见。我并不是真的要征求这些意见,我想知道的是细节:是什么使一个图形工具包与另一个不同,Qt 和 Gtk+ 有哪些差异?

【问题讨论】:

    标签: user-interface qt gtk


    【解决方案1】:

    首先,您可以从 C 中使用 Gtk+。Qt 仅支持 C++。

    此外,Gtk+ 应用程序往往具有持续变化的对话框,带有一个关闭按钮。 Qt 倾向于遵循 Ok/Apply/Cancel 的路线。不过,我不知道在工具包级别执行了多少。

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

    【讨论】:

    • 我以前听说过(Qt 仅是 C++),但我不太明白它的含义。我可以在 C#、python 等中使用 Gtk+。我知道您至少可以在 python 中使用 Qt。 Qt 只有 C++ 是什么意思?
    • @Matthew:这只是意味着您不能将它与 C 一起使用。但是,您可以绑定到任何高级语言(Python、Ruby 等)。
    • “自动保存设置”与“确定、应用、取消”实际上更像是 Gnome 与 KDE 的对比。两个工具包都可以处理。
    • Qt 仅是 C++。这是错误的。因为 Qt 支持多种编程语言。
    【解决方案2】:

    要了解差异,最好了解历史。

    QT 是作为 UI 开发的,在刚开始开发 KDE 时存在一些许可问题。 KDE 选择 QT 是因为当时没有太多选择(Motif、Tcl/Tk 等等)

    GIMP 开始开发,当时 Window Toolkits 还不能满足开发人员的需求,因此他们开始编写 Gimp Tool Kit (GTK)。一段时间后决定重写 GTK 并使其面向对象 (GTK+)。

    也是在这个时候,由于 QT 的潜在许可问题,Gnome 启动并决定使用 GTK+ 库。

    现在,如果您查看 Wikipedia 上的 QT DesignGTK Design 条目,您可以开始看到系统之间的一些差异。

    请注意,QT 被称为:

    跨平台应用开发框架

    而 GTK+ 被称为:

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

    如果这些条目是可信的,那么我认为这就是我们可以在两者之间的主要区别,但我会说它在当今世界中是一条相当不错的线。

    【讨论】:

    • 这并没有什么区别。这仅仅意味着 GTK 使用单独的库(glib、GObject 等)完成基本的工作,而 Qt 在 QtCore 中拥有一切。更接近的比较是 QtGui 与 GTK。
    • 另一个历史问题,当查看跨平台能力时,这是从 Qt 的第一个源代码行考虑到的,因为 GTK 从一开始就被设计为 X11 工具包,并且然后后来扩展到跨平台之类的东西。为不同的东西拥有多个库确实会让跨平台变得很麻烦,为什么 Qt 是我在这里的首选。
    【解决方案3】:

    我不能直接与 Gtk+ 交谈,但在我以前的工作中我使用 Gtkmm,而在我目前的工作中我使用 Qt。两者都是 C++,因此在这方面它们是一致的,但 Gtkmm 是/曾经只是 Gtk+ 代码的包装器,它是直接 C 语言。

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

    使用 Gtkmm 调试有点痛苦,因为这些类通常除了持有指向结构的指针和调用 Gtk+ 函数之外什么都不做。这种额外的间接性可能很烦人。

    Qt 有更多可用于各种设置的辅助代码,至少与我使用的 Gtkmm 版本相比。当您需要为程序添加新维度时,使线程、进程间通信和网络变得更容易的东西都会受到赞赏。他们也有自己的容器,如果你想使用它们,我认为它们的界面比 STL 容器更清晰——但它们最终会做同样的事情,所以这是一个轻微的优势。

    Gtkmm 和 Qt 之间的信号/槽机制是不同的。 Qt 依赖于编译过程中的一个额外步骤来生成元信息,它用于其信号/插槽。使用信号或槽的对象必须从 QObject 继承,并且 QObject 继承必须是第一个,没有菱形结构。例如,这使得定义一个发出信号的抽象接口变得困难。从好的方面来说,他们天生就知道线程问题,并会在必要时将信号/插槽连接转换为基于事件的连接。 Gtkmm 使用 SigC 信号,它们是简单的 C++ 类,对我来说似乎在更广泛的情况下很有用。此外,我记得只有建立连接的对象需要从魔术基类继承。另外,由于槽是对象,因此您也可以将它们用作非常好的自适应仿函数对象。

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

    【讨论】:

      猜你喜欢
      • 2014-06-08
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      相关资源
      最近更新 更多