(点击上方公众号,可快速关注)
对GTK一直”情有独钟“,这个在之前有说过:主要是因为它支持GObject Introspection,简称(GI),能实现自动化的语言绑定,别的框架要绑定另一门语言需要很大的人力去”手写“代码,而GTK则基本上只需要写很少胶水代码就能实现自动生成语言绑定的代码。带来的一个好处就是这个框架支持广泛的语言绑定,包括我喜爱的Haskell语言。
现状
GTK4终于发布了,带来了更好的 Windows 支持,这是我相对关注的。因为我主要在Windows下写一些简化工作的小工具。但经过一段时间的试用,目前还是有不少问题的:
开发库的支持还比较初级
各Linux发行版、FreeBSD、msys2等软件库还基本没看到Gtk4的影子。截止到本篇文章发布时,只有ArchLinux的Aur软件库和msys2包含Gtk4的软件开发库。但它们支持的版本还是3.99.4,所以还得静待一段时间,才能更新维护到4.0版本。
目前msys2中3.99.4是有问题的,一些输入的组件,
GtkEntry
、GtkTextView
等,有些字母输入不进去。所以想尝鲜的用户最好自己编译。
API不是向后兼容的【实际不是问题】
相对Gtk3,API变动还是挺大的,毕竟是一个大的版本更新。已有使用Gtk3的项目可以继续使用Gtk3,毕竟迁移是需要成本的;新项目可以考虑使用Gtk4,能用上最新的特性。Gtk3的支持周期是很长的,而且不同版本的Gtk是可以共存的,这跟我们经常说的API兼容还不太一样,每个版本的Gtk更像是独立的产品,虽然相似点很多。
所以准确来讲,这一点不是问题。
API还需进一步完善
举一例:
Gtk4引入了列表视图相关的组件,这样可以在列表展示的情况下避免使用
GtkTreeView
相关的API,在API的易用性和性能上都提升了不少。但其依赖于GListModel
接口,其简单实现GListStore
的创建需要指定GType
,这要求我们要展示相对复杂的数据结构时要创建GObject
的子类。GListStore * g_list_store_new (GType item_type);
使用
GObject
语义创建一个类,对于很多不熟悉的人还是比较复杂的;其C语言接口提供了不少宏可以简化这一过程,但其他语言绑定就麻烦多了,为了实现类似C++这样简单的类结构:struct Person { int age; char* name; };
要写很多的样板代码。
后续API完善的地方可能会有几个方向:
提供诸如
GtkStringList
的简易API,这类API简化了创建成本。现在已经提供了GtkDirectoryList
等api,但还不够用。其他关联的api返回
GListModel
类型。目前很多遗存API都是返回GList
,导致新的GtkListView
无法直接使用,后续可能会增加返回GListModel
的函数,进一步简化GtkListView
的使用。提供GtkBuilder更广泛的支持。老的
GtkListStore
是可以通过XML创建的,为啥新的不行?
学习资源还太少
本身GTK相关的书籍就比较少,而且还集中在Gtk3上。Gtk4的资料目前还是主要参考官方资料上,下一节主要介绍。
学习资源
官方Api参考
地址:https://gnome.pages.gitlab.gnome.org/gtk/gtk/
提供了整个Gtk4的API参考,而且Getting Started with GTK部分提供了入门的几个示例,很具有实操性。
gtk4-demo
每个例子都有演示和代码,非常难得的资源。
喜欢我的文章,请关注我的公众号。