首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将GtkTextView连接到GtkMenuItem

如何将GtkTextView连接到GtkMenuItem
EN

Stack Overflow用户
提问于 2010-01-23 13:12:17
回答 1查看 1.1K关注 0票数 2

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

请注意,这是一个双向连接。(1)当剪切、复制或粘贴GtkMenuItem中的一个被激活时,它会告诉GtkTextView执行某些操作。(2)在GtkTextView中选择或清除时,分别启用或禁用剪切和复制(参见几何编辑为例)。此外,(3)是否启用粘贴取决于剪贴板的状态。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-01-23 18:35:55

您将需要一些额外的C代码,但不是很多。在本例中,我假设您的菜单项使用的是GtkActions,但如果不是这样,解决方案应该是类似的。

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

代码语言:javascript
复制
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信号

代码语言:javascript
复制
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);
}

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

代码语言:javascript
复制
gtk_action_set_sensitive(data->paste_action, 
    gtk_clipboard_wait_is_text_available(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)));

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

注意:这里输入的代码都是未经测试的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2122215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档