- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 Glade、GtkBuilder 和 C 在 GTK 中制作一个简单的文本编辑器(作为练习)。我有一个包含剪切、复制和粘贴的编辑菜单以及一个用于文本的 GtkTextView。 GtkTextView 会自动为自己绑定(bind)剪切/复制/粘贴序列(如果您右键单击,甚至会提供菜单项)。我想将菜单栏中的剪切、复制和粘贴菜单项连接到我的 TextView ,以便它们按预期运行。
请注意,这是双向连接。 (1) 当剪切、复制或粘贴 GtkMenuItem 之一被激活时,它告诉 GtkTextView 做一些事情。 (2) 当在 GtkTextView 中进行选择或清除选择时,剪切和复制分别被启用或禁用(以 gedit 为例)。此外,(3)是否启用粘贴取决于剪贴板的状态。
如何将我的剪切、复制和粘贴菜单项连接到 TextView ?有没有办法在 Glade 中做到这一点,或者我的 C 程序是否需要一些额外的代码?是否有简化的方法来执行此操作,或者我是否需要手动实现上一段中所述的所有三种行为?
最佳答案
您将需要一些额外的 C 代码,但不多。对于此示例,我假设您正在为菜单项使用 GtkAction
,但如果您不是,解决方案应该是相似的。
首先在 Glade 中进行剪切、复制和粘贴操作的回调。当您连接信号时,传递一些至少包含指向剪切、复制和粘贴操作以及 TextView 的指针的数据结构作为用户数据。
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)));
这假定用户无法手动清除剪贴板(大多数程序不允许您这样做。)
读者注意:此处输入的代码均未经测试。
关于c - 如何将 GtkTextView 连接到 GtkMenuItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2122215/
我正在开发一个 voip 调用应用程序。我需要做的是在接到来电时将 Activity 带到前台。我在应用程序中使用 Twilio,并在收到推送消息时开始调用。 问题是我试图在接到任何电话时显示 Act
我是一名优秀的程序员,十分优秀!