2

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

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

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

4

1 回答 1

2

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

首先为 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您的信号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);
}

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

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

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

警告讲师:此处键入的代码均未经测试。

于 2010-01-23T10:35:54.720 回答