为了总结最近关于输入主题的一系列帖子,让我们来谈谈 GTK 4 中的文本编辑。
简单的:快捷键
也许你只需要处理一些按键作为编辑命令,例如 Ctrl-z 来撤消。在这种情况下,你可以直接使用带有操作的快捷键,并在你的窗口小部件的 class_init 中设置好一切
/* install an undo action */ gtk_widget_class_install_action (widget_class, "text.undo", NULL, my_undo_func); /* bind Ctrl-z to the undo action */ gtk_widget_class_add_binding_action (widget_class, GDK_KEY_z, GDK_CONTROL_MASK, "text.undo", NULL);
复杂的:文本编辑器
当你需要完整的文本编辑时,最好的方法是重用 GTK 中为此目的而预先制作的窗口小部件:其中一个输入框,或者如果你需要一个成熟的文本编辑器,则使用 GtkTextView。
如果现有的输入框都不适合你的用例,你也可以围绕 GtkText 小部件包装你自己的 GtkEditable 实现,并免费获得文本编辑小部件的所有困难部分。GTK 文档解释了如何做到这一点。
中间地带
但是,如果你不想要一个输入框,但仍然需要让你的用户方便地输入诸如 ñ 或 Å 等单个 Unicode 字符,该怎么办呢? 我会让你自己想出这种情况的用例(虽然我脑子里有一个)。
你可以做的一件事是直接使用 GtkIMContext,并让它为你处理按键事件。它的工作原理是将按键事件控制器附加到你的小部件,并将输入法上下文连接到它
controller = gtk_event_controller_key_new (); gtk_widget_add_controller (widget, controller); im_context = gtk_im_multicontext_new (); gtk_event_controller_key_set_im_context (controller, im_context);
现在,到达你的小部件的按键事件将被传递到输入法上下文。连接一个处理程序到它的 ::commit 信号以接收完成的输入
static void commit_cb (GtkIMContext *context, const char *str, DemoWidget *demo) { pango_layout_set_text (demo->layout, str, -1); pango_layout_set_attributes (demo->layout, NULL); gtk_widget_queue_draw (GTK_WIDGET (demo)); } ... g_signal_connect (im_context, "commit", G_CALLBACK (commit_cb), demo);
你可以连接一个类似的处理程序到 ::preedit-changed 信号,以便在预编辑期间提供用户反馈,就像 GtkEntry 所做的那样。
单字符输入的完整示例可以在这里找到。