(这是关于 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 文档中的操作概述。