GTK 4 中的条目

最近在 GTK 主分支上进行的一项较大的重构是重新设计了条目层次结构。这篇文章总结了已经发生的变化,以及我们为什么认为这样会更好。

GTK 3 中的条目

让我们先看看 GTK 3 中是如何实现的。

GtkEntry 是这里的基本类。它实现了 GtkEditable 接口。GtkSpinButton 是 GtkEntry 的子类。多年来,添加了越来越多的功能。GtkEntry 获得了对条目补全、嵌入图标和显示进度的支持。我们还添加了另一个子类 GtkSearchEntry。

这种方法的一些问题立即显现出来。gtkentry.c 超过 11100 行代码。不仅很难在这个庞大的代码库中添加更多功能,而且很难对其进行子类化——这也是创建你自己的条目的唯一方法,因为所有单行文本编辑功能都在 GtkEntry 内部。

GtkEditable 接口真的很老了——它在 GTK 2 之前就存在了。不幸的是,它作为一个接口并没有真正成功——GtkEntry 是唯一的实现,而且它以一种令人困惑的方式在内部使用接口函数。

GTK 4 中的条目

现在让我们看看 GTK 主分支中的情况。

我们做的第一件事是将 GtkEntry 的核心文本编辑功能移动到一个名为 GtkText 的新部件中。这基本上是一个没有所有额外功能(如图标、补全和进度)的条目。

我们通过向 GtkEditable 接口添加一些更常见的功能(如 width-chars 和 max-width-chars)使其更有用,并使 GtkText 实现它。我们还添加了辅助 API,以便轻松地将 GtkEditable 实现委托给另一个对象。

现在,所有“复杂”的条目部件(GtkEntry、GtkSpinButton、GtkSearchEntry)都是组合部件,其中包含一个 GtkText 子部件,并将其 GtkEditable 实现委托给这个子部件。

最后,我们添加了一个新的 GtkPasswordEntry 部件,它接管了 GtkEntry 过去拥有的相应功能,例如显示 Caps Lock 警告

或让用户查看内容。

为什么这样更好?

此重构的主要目标之一是使在 GTK 之外创建自定义条目部件更容易。

过去,这需要对 GtkEntry 进行子类化,并导航一个复杂的 vfunc 迷宫进行覆盖。现在,你只需添加一个 GtkText 部件,将你的 GtkEditable 实现委托给它,就可以轻松拥有一个功能齐全的条目部件。

并且你可以在 GtkText 组件周围添加很多花哨的东西,这有很多灵活性。例如,我们在 gtk4-demo 中添加了一个带标签的条目,现在可以在 GTK 之外轻松实现。

从 GTK 3 移植时会受到影响吗?

在将代码移植到这种新的条目实现风格时,需要注意一些可能存在的问题。

GtkSearchEntry 和 GtkSpinButton 不再派生自 GtkEntry。如果你看到关于从这些类之一强制转换为 GtkEntry 的运行时警告,你很可能需要切换到使用 GtkEditable API。

GtkEntry 和其他复杂的条目部件不再可聚焦——焦点会移动到包含的 GtkText。但 gtk_widget_grab_focus() 仍然有效,并将焦点移动到正确的位置。你不太可能受此影响。

Caps Lock 警告功能已从 GtkEntry 中删除。如果你将 GtkEntry 的 visibility 设置为 FALSE 来表示密码,你应该切换到 GtkPasswordEntry。

如果你将 GtkEntry 用于基本编辑功能,并且不需要任何额外的条目功能,你应该考虑使用 GtkText。

关于“GTK 4 中的条目”的 4 条评论

  1. GtkText 或 GtkPasswordEntry 或基于 GtkText 的自定义子类现在是否能够以某种方式支持多行密码输入?

  2. 你们能不能让你们的网站更新一下?

    gnome.org 和 gtk.org 上没有任何内容是正确更新的,甚至更糟糕!

    当跟踪进度时,这令人沮丧,并且项目看起来像是死气沉沉/管理混乱。

    一点完美主义永远不会有害!

评论已关闭。