gpt4 book ai didi

c - 如何将 GtkTextView 连接到 GtkMenuItem

转载 作者:太空宇宙 更新时间:2023-11-03 23:36:30 25 4
gpt4 key购买 nike

我正在使用 Glade、GtkBuilder 和 C 在 GTK 中制作一个简单的文本编辑器(作为练习)。我有一个包含剪切、复制和粘贴的编辑菜单以及一个用于文本的 GtkTextView。 GtkTextView 会自动为自己绑定(bind)剪切/复制/粘贴序列(如果您右键单击,甚至会提供菜单项)。我想将菜单栏中的剪切、复制和粘贴菜单项连接到我的 TextView ,以便它们按预期运行。

请注意,这是双向连接。 (1) 当剪切、复制或粘贴 GtkMenuItem 之一被激活时,它告诉 GtkTextView 做一些事情。 (2) 当在 GtkTextView 中进行选择或清除选择时,剪切和复制分别被启用或禁用(以 gedit 为例)。此外,(3)是否启用粘贴取决于剪贴板的状态。

如何将我的剪切、复制和粘贴菜单项连接到 TextView ?有没有办法在 Glade 中做到这一点,或者我的 C 程序是否需要一些额外的代码?是否有简化的方法来执行此操作,或者我是否需要手动实现上一段中所述的所有三种行为?

最佳答案

您将需要一些额外的 C 代码,但不多。对于此示例,我假设您正在为菜单项使用 GtkAction,但如果您不是,解决方案应该是相似的。

首先在 Glade 中进行剪切、复制和粘贴操作的回调。当您连接信号时,传递一些至少包含指向剪切、复制和粘贴操作以及 TextView 的指针的数据结构作为用户数据。

void
on_cut(GtkAction *action, SomeStruct *data)
{
g_signal_emit_by_name(data->view, "cut-clipboard", NULL);
gtk_action_set_sensitive(data->paste_action, TRUE);
}

void
on_copy(GtkAction *action, SomeStruct *data)
{
g_signal_emit_by_name(data->view, "copy-clipboard", NULL);
gtk_action_set_sensitive(data->paste_action, TRUE);
}

void
on_paste(GtkAction *action, SomeStruct *data)
{
g_signal_emit_by_name(data->view, "paste-clipboard", NULL);
}

接下来,连接到 GtkTextBuffernotify::has-selection 信号:

void
on_has_selection_notify(GtkTextBuffer *buffer, GParamSpec *pspec, SomeStruct *data)
{
gboolean has_selection = gtk_text_buffer_get_has_selection(buffer);
gtk_action_set_sensitive(data->cut_action, has_selection);
gtk_action_set_sensitive(data->copy_action, has_selection);
}

要确定粘贴操作的初始状态(以防启动应用程序时剪贴板上有文本),请在构建界面时运行以下代码:

gtk_action_set_sensitive(data->paste_action, 
gtk_clipboard_wait_is_text_available(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)));

这假定用户无法手动清除剪贴板(大多数程序不允许您这样做。)

读者注意:此处输入的代码均未经测试。

关于c - 如何将 GtkTextView 连接到 GtkMenuItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2122215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com