如何将GtkTextView连接到GtkMenuItem

时间:2010-01-23 05:12:17

标签: c gtk gtkbuilder

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

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

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

1 个答案:

答案 0 :(得分:2)

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

首先在Glade中进行剪切,复制和粘贴操作的回调。连接信号时,将包含至少指向剪切,复制和粘贴操作的指针的数据结构和文本视图作为用户数据传递。

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);
}

接下来,连接到notify::has-selection的<{1}}信号:

GtkTextBuffer

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

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);
}

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

警告lector:这里输入的代码都是未经测试的。