我做的GTK使用格莱德,GtkBuilder一个微不足道的文本编辑器(作为练习)和C.我有剪切,复制编辑菜单,粘贴以及文本一GtkTextView。 GtkTextView自动绑定的剪切/复制/粘贴序列本身(甚至是提供菜单项如果你右击)。我要连接的剪切,复制和粘贴在我的菜单栏上的菜单项到我的文本视图,从而预计他们将采取行动。

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

我如何连接我的剪切,复制和粘贴菜单项,文中观点?有没有办法做到这一点格莱德,或将我的C程序需要这个额外的代码?有一个精简的方式来做到这一点,或者我需要实现手动前款规定的所有三种行为?

有帮助吗?

解决方案

您将需要一些额外的C代码,但数量不多。在这个例子中,我假设你使用GtkActions您的菜单项,但如果你不是解决办法应该是相似的。

首先要回调的剪下格莱德行动。当连接到的信号,通过包含至少指向切口的一些数据结构,复制和粘贴操作,和文本视图,作为用户数据。

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-selectionGtkTextBuffer信号:

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

这假定有没有办法让用户手动清除剪贴板(大多数程序不会让你做到这一点。)

买者讲师:如这里输入的代码是所有未测试

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top