(这是关于 GTK 4 中自定义部件的系列文章的第五部分。 第一部分, 第二部分, 第三部分, 第四部分)。
激活所有功能
GTK 中的许多东西都可以被激活:按钮、复选框、开关、菜单项等等。通常,可以使用多种方式实现同一任务,例如,将选择复制到剪贴板可以通过 Control-C 快捷键和上下文菜单中的项目来实现。
在 GTK 内部,有多种方式可以进行:可能会发出信号(::activate,或 ::mnemonic-activate,或快捷键信号),可能会调用回调,或者可能会激活 GAction。这些在 GTK 4 中都不是全新的,但我们正在朝着使用 GAction 作为连接操作的主要机制发展。
操作
操作可以在 GTK 应用程序中以各种形式出现。
首先,有全局应用程序操作,添加到 GtkApplication 或 GtkApplicationWindow(这两者都实现了 GActionGroup 接口)。这是操作在 GTK 3 中首次出现的地方,主要目的是将它们导出到会话总线上,以便与应用程序菜单一起使用。
我们还允许通过调用 gtk_widget_insert_action_group() 将操作与部件关联。以这种方式添加的操作仅当它源于层次结构中部件的下方时才会被考虑激活。
在 GTK 4 中创建操作的一种新方法是通过 gtk_widget_class_install_action() 在 class_init 函数中声明操作,类似于使用 g_object_class_install_property() 声明属性的方式。以这种方式创建的操作可用于部件的每个实例。
以下是来自 GtkColorSwatch 的一个示例
gtk_widget_class_install_action (widget_class, "color.customize", "(dddd)", customize_color);
当 color.customize 操作被激活时,会调用 customize_color 函数。如你所见,操作可以声明它们期望参数。这是使用 GVariant 语法;你需要提供四个双精度值。
一个方便的简写允许你创建一个有状态的操作来设置部件类的属性
gtk_widget_class_install_property_action (widget_class, "misc.toggle-visibility", "visibility");
这将声明一个名为 misc.toggle-visibility 的操作,它会切换布尔值 visibility 属性的值。
可操作对象和菜单
仅仅声明操作是不够的,你还需要以某种形式将你的操作连接到 UI。对于像按钮或开关这样实现了可操作接口的部件,这就像设置 action-name 属性一样简单
gtk_actionable_set_action_name (GTK_ACTIONABLE (button), "misc.toggle-visibility");
当然,你也可以在 ui 文件中执行此操作。
如果你想从菜单中激活你的操作,你可能会使用从 XML 构建的菜单模型,例如这个
<menu id="menu"> <section> <item> <attribute name="label">Show text</attribute> <attribute name="action">misc.toggle-visibility</attribute> </item> </section> </menu>
在 GTK 3 中,你会连接到 ::populate-popup 信号,以便将项目添加到标签或条目的上下文菜单。在 GTK 4 中,这是通过将菜单模型添加到部件来完成的
gtk_entry_set_extra_menu (entry, menu_model);
深入了解
要了解有关 GTK 4 中操作的更多信息,你可以阅读 GTK 文档中的操作概述。