我是一名C#程序员,大约两年前开始使用ubuntu。我想学习用C或C++编写GUI程序。我不太喜欢mono,它经常会在我的系统上崩溃。我对C++有基本的理解,但从未使用过C语言,但它看起来很酷。我应该学习/使用哪个工具包?请列出每种工具包的优缺点。谢谢!
我是一名C#程序员,大约两年前开始使用ubuntu。我想学习用C或C++编写GUI程序。我不太喜欢mono,它经常会在我的系统上崩溃。我对C++有基本的理解,但从未使用过C语言,但它看起来很酷。我应该学习/使用哪个工具包?请列出每种工具包的优缺点。谢谢!
我可能会被指责有偏见,因为我确实帮助贡献了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 ++。
如果您是C#程序员,为什么不看一下Vala呢?
对于大多数我的Linux图形用户界面应用程序,我使用pygtk,但是Python对于我现在正在处理的项目来说太慢了,因此我尝试选择GTK+和GTKmm之一。然后我遇到了Vala。
它是一种相当新的语言,因此目前文档相当有限,但我认为它具有C#语法和C速度的优点。
vala
,听起来很有趣。 - user10838321由于您更熟悉C++,所以您可能会发现GTKmm更适合您,因为您可以使用RAII等习惯用语。不幸的是,GTKmm有一些缺失,缺少一些较少使用的GTK部分。
然而,单独的GTK+本质上暴露了一个类似于C++中的对象模型,但只有C函数。诸如在C++中的构造和销毁都是在C API中显式完成的,并且小部件实例仅通过指针处理。
尝试两种方法,看看哪个更适合您的项目。
mm
库(gtkmm
、glibmm
)的文档是写在头文件中的,但是那里写的通常是通过将 GTK+/GLib 等 .c
文件中的 C 函数文档在封装(生成)时转换而来的。然而,这可以被覆盖并编写自定义文档,例如当 C 文档包含许多不易转换的 C 术语时。当然,如果您发现任何遗漏或转换错误的内容,则欢迎在 Bugzilla 或邮件列表上提供对 mm
标头或从 C 文档转换的例程的修补程序。 - underscore_d你看过Qt吗?
它是一个很好的C++设计,跨平台且遵循LGPL协议。
CONFIG += no_keywords
,这样就不会与其他库(例如boost::signals或gnome signals)产生冲突了。 - Jacob Krieggtkmm
是我第一个看到的GUI库,我没有立即感到困惑和恐惧(包括GTK+在内)。事实上,当时我正在自学C++11,而gtkmm
则努力使用现代语言版本(与GTK+不同),这增加了它的吸引力。就像你说的那样,一旦我使用gtkmm
来掌握GUI模型的工作原理,并且由于需要报告GTK+中的一些小错误;-),再次查看后,后者变得更加容易理解。现在,我几乎欣赏它!;-) - underscore_d