我应该学习GTK+还是GTKMM?

12

我是一名C#程序员,大约两年前开始使用ubuntu。我想学习用C或C++编写GUI程序。我不太喜欢mono,它经常会在我的系统上崩溃。我对C++有基本的理解,但从未使用过C语言,但它看起来很酷。我应该学习/使用哪个工具包?请列出每种工具包的优缺点。谢谢!


哎呀,试试Qt吧... - Jacob Krieg
7个回答

38

我可能会被指责有偏见,因为我确实帮助贡献了gtkmm,但我首先是一个用户,所以...总之,如果你熟悉C++,我强烈推荐使用gtkmm。与GTK+相比,由于引用计数对象由智能指针自动管理,因此使用gtkmm内存管理更加容易。您还可以将对象实例化为auto变量(例如在堆栈上)并通过其作用域确定其生命周期。因此,在实践中,使用gtkmm比使用GTK+更容易避免内存泄漏。

在我看来,gtkmm比GTK+另一个巨大的优势是使用类型安全的信号框架。在GTK +中,您不断需要将事物作为void指针传递,然后将它们转换为您认为应该的类型。在gtkmm中,您无需执行此操作,并且可以利用编译器对信号处理程序施加类型安全检查的优势。

另一个比C / GTK +更大的优势是派生新类的易用性。在GTK +中,您需要编写大量样板代码,并基本上重新实现您在C ++作为语言的一部分免费获得的东西(例如继承,构造函数,析构函数等)。这更加乏味且容易出错。

greyfade提到gtkmm不完整,从某种程度上来说他是对的-- gtkmm并没有涵盖GTK + API中的绝对所有内容(尽管它非常接近)。但实际上这并不是问题,因为您始终可以直接从gtkmm代码中使用C / GTK + API。与诸如C#或python绑定之类的东西相比,这种C兼容性是C ++的巨大优势,如果绑定未覆盖API的一部分,则无法使用替代方案。

在我的看法里,选择GTK+而不是gtkmm的唯一真正原因是,gtkmm具有略微更多的开销,因为它是在C库的顶部包装器(但这通常只是一个单个函数调用,对性能的影响可以忽略不计),或者您讨厌或无法使用C ++。


18

如果您是C#程序员,为什么不看一下Vala呢?

对于大多数我的Linux图形用户界面应用程序,我使用pygtk,但是Python对于我现在正在处理的项目来说太慢了,因此我尝试选择GTK+和GTKmm之一。然后我遇到了Vala。

它是一种相当新的语言,因此目前文档相当有限,但我认为它具有C#语法和C速度的优点。


第一次听说 vala,听起来很有趣。 - user10838321

13

由于您更熟悉C++,所以您可能会发现GTKmm更适合您,因为您可以使用RAII等习惯用语。不幸的是,GTKmm有一些缺失,缺少一些较少使用的GTK部分。

然而,单独的GTK+本质上暴露了一个类似于C++中的对象模型,但只有C函数。诸如在C++中的构造和销毁都是在C API中显式完成的,并且小部件实例仅通过指针处理。

尝试两种方法,看看哪个更适合您的项目。


7
许多人都说,Gtkmm确实为您提供了良好的内存管理、引用计数对象等。但是,在一个方面它表现不佳,即文档。整个Gtkmm项目都饱受“无文档”现象之苦,所发布的(并在第三方网站上重新发布的)文档仅仅是头文件的javadoc扫描。
只是想让您知道您将要涉及到的内容。例如,滚动窗口是Gtkmm中文档编写得比较好的类之一。

1
准确地说,mm 库(gtkmmglibmm)的文档是写在头文件中的,但是那里写的通常是通过将 GTK+/GLib 等 .c 文件中的 C 函数文档在封装(生成)时转换而来的。然而,这可以被覆盖并编写自定义文档,例如当 C 文档包含许多不易转换的 C 术语时。当然,如果您发现任何遗漏或转换错误的内容,则欢迎在 Bugzilla 或邮件列表上提供对 mm 标头或从 C 文档转换的例程的修补程序。 - underscore_d

5

3
我学习了 Vala 并且非常喜欢它,但是文档质量很差。 - Kredns
valaide已经死了。 - user10838321

4

你看过Qt吗?
它是一个很好的C++设计,跨平台且遵循LGPL协议。


8
是的,我知道你的意思。我的意思是不是真的。 - Iraimbilanja
1
Qt!= KDE“不正确的外观”是与主题相关的。尝试更改Qt主题以获得漂亮的外观。 - Anonymous
1
我不同意“好的C++设计”的说法。它滥用宏并妨碍了其他库(例如boost :: signals)的使用。这只是一个附带评论。 - David Rodríguez - dribeas
1
正是Qt使用的非标准C++扩展使我转向gtkmm。我宁愿选择一些不需要使用这些扩展就能“正常工作”的东西。 - Kevin Anderson
1
@DavidRodríguez-dribeas 你可以简单地使用 CONFIG += no_keywords,这样就不会与其他库(例如boost::signals或gnome signals)产生冲突了。 - Jacob Krieg
显示剩余7条评论

3
我认为最好的方法是先学习gtkmm!在你完成了gtkmm的基础知识后,学习GTK+应该会比较容易(前提是你知道C语言并且对指针很熟悉)。
如果你不懂C语言,你可以通过阅读Dennis Ritchie的《C程序设计语言》快速学习。
我建议你首先学习gtkmm,因为它是专门为C++设计的。C++与C#有些相似,因为两者都是面向对象的语言,所以学习gtkmm相对来说会更容易。
在学完gtkmm之后,你可以转向学习GTK+。
大多数开源公司使用的是GTK+而不是gtkmm,所以学习GTK+是值得的!

1
当我决定自学GUI编程时,gtkmm是我第一个看到的GUI库,我没有立即感到困惑和恐惧(包括GTK+在内)。事实上,当时我正在自学C++11,而gtkmm则努力使用现代语言版本(与GTK+不同),这增加了它的吸引力。就像你说的那样,一旦我使用gtkmm来掌握GUI模型的工作原理,并且由于需要报告GTK+中的一些小错误;-),再次查看后,后者变得更加容易理解。现在,我几乎欣赏它!;-) - underscore_d

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