我正在使用Glade、GtkBuilder和C在GTK中制作一个简单的文本编辑器(作为练习)。我有一个编辑菜单,其中包含剪切、复制和粘贴以及文本的GtkTextView。GtkTextView会自动为自己绑定剪切/复制/粘贴序列(如果右键单击,甚至还会提供菜单项)。我希望将菜单栏中的剪切、复制和粘贴菜单项连接到文本视图,以便它们可以按预期运行。
请注意,这是一个双向连接。(1)当剪切、复制或粘贴GtkMenuItem中的一个被激活时,它会告诉GtkTextView执行某些操作。(2)在GtkTextView中选择或清除时,分别启用或禁用剪切和复制(参见几何编辑为例)。此外,(3)是否启用粘贴取决于剪贴板的状态。
如何将剪切、复制和粘贴菜单项连接到文本视图?有没有办法在Glade中做到这一点,或者我的C程序需要一些额外的代码来做到这一点?有没有一种简化的方法来做到这一点,或者我需要手动实现上面段落中所述的所有三种行为?
发布于 2010-01-23 18:35:55
您将需要一些额外的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);
}接下来,连接到GtkTextBuffer的notify::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)));这假设用户没有办法手动清除剪贴板(大多数程序都不允许这样做)。
注意:这里输入的代码都是未经测试的。
https://stackoverflow.com/questions/2122215
复制相似问题