我应该学习 GTK+ 还是 GTKMM?

Posted

技术标签:

【中文标题】我应该学习 GTK+ 还是 GTKMM?【英文标题】:Should I learn GTK+ or GTKMM? 【发布时间】:2009-03-15 18:54:27 【问题描述】:

我是一名 C# 程序员,大约 2 年前开始使用 ubuntu。我想学习 C 或 C++ 中的 GUI 编程。我真的不喜欢单声道,它往往会在我的系统上崩溃。我对 C++ 有基本的了解。我从未在 C 中工作过,但它看起来很酷。我应该学习/使用哪个工具包?给出每个的优点/缺点。谢谢!

【问题讨论】:

天啊,请试试 Qt... 【参考方案1】:

我可能会被指责有偏见,因为我确实帮助了 gtkmm,但我首先是用户,所以...无论如何,如果您对 C++ 感到满意,我强烈推荐 gtkmm。使用 gtkmm 比使用 GTK+ 更容易管理内存,因为引用计数对象是使用智能指针自动管理的。您还可以将对象实例化为自动变量(例如,在堆栈上),并使其生命周期由其范围确定。所以在实践中,使用 gtkmm 比使用 GTK+ 更容易避免内存泄漏。

gtkmm 相对于 GTK+(在我看来)的另一个巨大优势是使用了类型安全的信号框架。在 GTK+ 中,您经常需要将事物作为 void 指针传递,然后将它们转换为您认为它们应该是的类型。在 gtkmm 中,您不需要这样做,并且可以利用编译器在您的信号处理程序上强制执行类型安全。

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

greyfade 提到 gtkmm 是不完整的,在一定程度上他是对的—— gtkmm 并没有完全涵盖 GTK+ API 中的所有内容(尽管它非常接近)。但实际上这不是问题,因为您总是可以直接从您的 gtkmm 代码中使用 C/GTK+ API。这种 C 兼容性是 C++ 相对于 C# 或 python 绑定之类的一个巨大优势,如果绑定不涵盖 API 的一部分,您将别无选择。

选择 GTK+ 而不是 gtkmm (IMO) 的唯一真正原因是 gtkmm 有一点额外的开销,因为它是 C 库顶部的包装器(但这通常只是一个函数调用,它将有影响可以忽略不计),或者如果你讨厌或不能使用 C++。

【讨论】:

【参考方案2】:

如果你是 C# 程序员,何不看看Vala?

我的大多数 Linux GUI 应用程序都使用 pygtk,但 Python 对我现在正在处理的项目来说太慢了,所以我试图选择 GTK+ 和 GTKmm 中的一个。然后我遇到了瓦拉。

这是一门相当新的语言,因此目前的文档非常有限,但我认为它具有两全其美:C# 语法和 C 速度。

【讨论】:

第一次听说vala,听起来很有趣【参考方案3】:

由于您更熟悉 C++,您可能会发现 GTKmm 更合适,因为您可以使用像 RAII 这样的习语。不幸的是,GTKmm 有点不完整,并且缺少一些 GTK 较少使用的部分。

然而,GTK+ 本身本质上公开了一个类似于 C++ 中的对象模型,但只有 C 函数。 C++ 中的构造和销毁等事情在 C API 中显式完成,小部件的实例仅通过指针处理。

两者都试一下,看看哪个更适合你的项目。

【讨论】:

【参考方案4】:

正如许多人所说,Gtkmm 确实为您提供了良好的内存管理、引用计数对象等。不过,它确实属于一个部门。文档。整个 Gtkmm 项目都受到“无文档”现象的影响,其中发布(并在 3rd 方网站上重新发布)文档只是对头文件的 javadoc 扫描。

只是想让你知道你会进入什么领域。例如,Scrolled Window 是 Gtkmm 中记录较好的类之一。

【讨论】:

确切地说,mm 库(gtkmmglibmm)的文档被写入标题中,但那里写入的内容通常是通过从 C 函数转换文档生成的在 GTK+/GLib/等中。 .c 包裹(建筑)点的文件。但是,这可以被覆盖和编写自定义文档,例如当 C 文档包含许多不能很好地转换的 C-isms 时。当然,如果您发现任何丢失或转换错误的内容,那么在 Bugzilla 或邮件列表中欢迎对 mm 标头或从 C 文档转换的例程进行修补【参考方案5】:

我建议用 gedit 学习 vala

http://www.valaide.org/doku.php: 瓦拉

https://launchpad.net/valable:日食

http://code.google.com/p/vtg/:Gedit

http://abderrahim.arablug.org/blog/: 安居塔

【讨论】:

我学习了 vala 并且非常喜欢它,但是文档太糟糕了。 valaide 死了【参考方案6】:

我认为最好的方法是先学习 gtkmm!在您完成 gtkmm 的基础知识之后,GTK+ 应该会相当容易学习(前提是您了解 C 并且对指针很熟悉)。

如果你不懂 C,可以通过阅读 Dennis Ritchie 的 The C Programming Language 快速学习它

我建议你先学习gtkmm,因为它是专门为C++设计的,和C#有点类似,都是面向对象的,所以gtkmm会比GTK+更容易学习。

gtkmm 之后,您可以继续使用 GTK+

大部分开源公司使用 GTK+ 而不是 gtkmm,所以 GTK+ 值得学习!

【讨论】:

当我尝试自学 GUI 编程时,gtkmm 是我看到的第一个 GUI 库,我没有立即在莫名其妙的恐惧中退缩(包括 GTK+)。我当时正在自学 C++11,而gtkmm 齐心协力使用现代语言版本(同样,与 GTK+ 不同)增加了很多吸引力。是的,就像你说的,一旦我使用gtkmm 来了解 GUI 模型是如何工作的——并且由于需要在 GTK+ 中报告一些小错误 ;-)——当我使用后者时,后者变得更加有意义又看了一遍。现在,我几乎很感激! ;-)【参考方案7】:

你看过 Qt 吗? 这是不错的 C++ 设计、跨平台和 LGPL

【讨论】:

是的,我知道你的意思。我的意思是不是真的 Qt != KDE “看起来不正确”的东西与主题相关。尝试更改 Qt 主题以获得令人眼前一亮的效果。 我不同意“漂亮的 c++ 设计”。它滥用宏并妨碍其他库(例如 boost::signals)。就像旁注一样。 正是 Qt 使用的 C++ 的非标准扩展将我推向了 gtkmm。我宁愿拥有一些不需要使用它们来“正常工作”的东西。 @DavidRodríguez-dribeas 你可以简单地CONFIG += no_keywords 和其他库的干扰,如 boost::signals 或 gnome 信号消失了......

以上是关于我应该学习 GTK+ 还是 GTKMM?的主要内容,如果未能解决你的问题,请参考以下文章

gtkmm 和系统剪贴板

GTK+ / Gtkmm,检查notebook tab是不是已经存在,不存在时才创建

在 gtkmm3 中使用 Gtk::Assistant

gtkmm4:在 Gtk::HeaderBar 中时,Gtk::Button 点击​​信号不会触发

如何在 gtkmm 上将 Gtk::Widget 转换为 GtK::ScrolledWindow?

GTKmm - 无法将固定大小设置为 Gtk::Scale 小部件