2010-08-14 54 views
1

我使用pygtk,并想处理控制+ c有时做一个特殊的复制操作,但其他时间让gtk处理它。例如,我想在剪贴板上放置一个对象(如果可用),或者让control + c以正常方式在文本条目中使用。如何让gtk控件+ c被处理?

目前我有一个ActionGroup与“c”相关联,但总是吃击键,即使我返回False。如果我删除了ActionGroup,它总是在文本区域中工作。如果我添加ActionGroup,它总是处理它,并且复制在文本区域中不起作用。

有什么正确的方式来控制+ c出现在菜单中,有时处理按键,但其他时候,让它落入文本小部件?

回答

1

我不知道这是否是“正确”的方式,但这里是我如何做到的。我将应用程序窗口作为用户数据参数传递给动作回调。然后我找出窗口中关注了哪个小部件,并且如果有意义的话,我将复制命令传递给该小部件(即,所关注的小部件是像你说的那样的文本输入)。如果这没有意义,那么我从窗口的“默认”文本视图复制。

void 
action_copy(GtkAction *action, gpointer user_data) 
{ 
    GtkWidget *widget = gtk_window_get_focus(GTK_WINDOW(user_data)); 

    /* What actually happens depends on the type of widget that is focused */ 
    if(WEBKIT_IS_WEB_VIEW(widget)) 
     webkit_web_view_copy_clipboard(WEBKIT_WEB_VIEW(widget)); 
    else if((GTK_IS_LABEL(widget) && gtk_label_get_selectable(GTK_LABEL(widget))) 
     || GTK_IS_ENTRY(widget) || GTK_IS_TEXT_VIEW(widget)) 
     g_signal_emit_by_name(widget, "copy-clipboard", NULL); 
    else 
     g_signal_emit_by_name(/* ...default text view... */, "copy-clipboard", NULL); 
} 

(获取默认文本视图实际上是通过调用我的应用程序类,这是GtkWindow子类中的方法get_default_view()做。但我不想在这里的问题复杂化)

+0

谢谢,这很有用。它至少证明我没有做一些疯狂的事情。我试图发出控件+ c的按键事件,但没有任何运气... – 2010-08-14 14:15:20

+0

你在试图什么? PS。如果答案很有用,请随意点击向上箭头;-) – ptomato 2010-08-14 15:36:29