【GTK4】现状及学习资源小结

news/2024/7/10 1:32:25 标签: java, python, 编程语言, vue, javascript

(点击上方公众号,可快速关注)

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是有问题的,一些输入的组件,GtkEntryGtkTextView等,有些字母输入不进去。

    所以想尝鲜的用户最好自己编译。

  • 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

    每个例子都有演示和代码,非常难得的资源。

喜欢我的文章,请关注我的公众号。



http://www.niftyadmin.cn/n/1027761.html

相关文章

【Haskell】Haskell语言挺好的

(点击上方公众号,可快速关注)写本篇文章主要是对Haskell做一些澄清,因为看到网上很多文章都要把它说没了,心里很是不平啊。每种编程语言都有其生命周期,但Haskell肯定在短期内淘汰不了。如果大家时间允许的…

Oracle 11g 新特性 -- Oracle Restart 说明

一. OHASD 说明Oracle 的Restart 特性是Oracle 11g里的新特性,在讲这个特性之前先看一下Oracle 11g RAC的进程。之前的Blog 有说明。Oracle 11gR2RAC 进程说明http://blog.csdn.net/tianlesoftware/article/details/6009962Oracle 11gR2 中对CRSD资源进…

【现代C++】使代码简洁的两种解包方式

&#xff08;点击上方公众号&#xff0c;可快速关注&#xff09;前言C没有模式匹配&#xff0c;在提取某个数据类型的元素或成员时会显得不太方便。假设t是一个包含3个元素的元组&#xff0c;类型为std::tuple<int,double,bool>&#xff0c;取每个元素的代码如下&#xf…

【现代C++】再谈Structured Bindings

&#xff08;点击上方公众号&#xff0c;可快速关注&#xff09;劳动节快乐&#xff01;打工人加油&#xff01;上一篇文章《使代码简洁的两种解包方式》介绍了两种代码简洁工具&#xff0c;尤其推荐Structured Bindings&#xff0c;因为它能绑定各种类型的成员。那篇文章介绍的…

一天一点学linux

随着Linux应用的扩展许多朋友开始接触Linux&#xff0c;根据学习Windwos的经验往往有一些茫然的感觉&#xff1a;不知从何处开始学起。就像是战争&#xff0c;你有勇气战胜一切敌人&#xff0c;但你的眼前一片 漆黑&#xff0c;你知道前面有很多敌人&#xff0c;但就不知道具体…

C++核心准则T.60:最小化模板对上下文的依赖

T.60: Minimize a templates context dependencies T.60:最小化模板对上下文的依赖 Reason&#xff08;原因&#xff09; Eases understanding. Minimizes errors from unexpected dependencies. Eases tool creation. 让理解更容易。尽量减少由于意外的依赖引发的错误。方便…

【现代C++】简洁的as_cast函数模板

&#xff08;点击上方公众号&#xff0c;可快速关注&#xff09;前言C17标准库加入了as_const函数模板&#xff0c;它可以将给定的左值引用转为常量左值引用&#xff0c;用法也很简单。下面的例子中&#xff0c;假设myValue是MyType类型的值&#xff1a;// C17 const MyType&am…

C++核心准则T.61:不要过度参数化成员(SCARY)

T.61: Do not over-parameterize members (SCARY) T.61:不要过度参数化成员&#xff08;SCARY&#xff09; Reason&#xff08;原因&#xff09; A member that does not depend on a template parameter cannot be used except for a specific template argument. This limi…