2009-12-18 59 views
6

我有一个弹出窗口(使用WINDOW_POPUP类型创建),其中包含一些小部件,其中包括一个文本项。问题是,当我点击它时,条目没有得到重点,所以我不能输入任何内容。是否有我必须设置的标志来允许窗口获得键盘焦点?如何给弹出键盘焦点Gtk.Window

回答

-1
#include <gtk/gtk.h> 

static gboolean delete_event(GtkWidget *widget, 
           GdkEvent *event, 
           gpointer data) 
{ 
    g_print ("delete event occurred\n"); 
    gtk_main_quit(); 
    return TRUE; 
} 

static void destroy(GtkWidget *widget, 
        gpointer data) 
{ 
    gtk_main_quit(); 
} 

int main(int argc, 
      char *argv[]) 
{ 
    GtkWidget *window; 
    GtkWidget *windowpopup; 
    GtkWidget *button; 

    gtk_init (&argc, &argv); 

    /* create a new window */ 
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    windowpopup = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_transient_for(GTK_WINDOW(windowpopup),GTK_WINDOW(window)); 
    gtk_window_set_destroy_with_parent(GTK_WINDOW(windowpopup),TRUE); 
    gtk_widget_show (windowpopup); 

    g_signal_connect (G_OBJECT (window), "delete_event", 
       G_CALLBACK (delete_event), NULL); 
    g_signal_connect (G_OBJECT (window), "destroy", 
       G_CALLBACK (destroy), NULL); 

    /* Creates a new button with the label "Hello World". */ 
    button = gtk_button_new_with_label ("Hello World"); 

    g_signal_connect_swapped (G_OBJECT (button), "clicked", 
        G_CALLBACK (gtk_widget_destroy), 
           G_OBJECT (window)); 

    gtk_container_add (GTK_CONTAINER (window), button); 

    gtk_widget_show (button); 
    gtk_widget_show (window); 

    gtk_main(); 

    return 0; 
} 
4

对于需要焦点的gtk窗口,不能使用WINDOW_POPUP。相反,你应该使用类型GTK_WINDOW_TOPLEVEL一个GtkWindow和呼叫下一个函数(或方法)

GtkWindow *result = g_object_new(GTK_TYPE_WINDOW, "type", GTK_WINDOW_TOPLEVEL, NULL); 
gtk_widget_set_can_focus(result, TRUE); 
gtk_window_set_decorated(GTK_WINDOW(result), FALSE); 
gtk_window_set_type_hint(GTK_WINDOW(result), GDK_WINDOW_TYPE_HINT_POPUP_MENU); 
gtk_window_set_transient_for(GTK_WINDOW(result), main_top_level_window); 

这为我工作...当这个“弹出”被破坏

遗憾的是在窗口列表中的图标闪烁短
1

尽管有以前的答案和GTK参考,但使用GTK_WINDOW_POPUP时可以抓住键盘焦点。您需要连接到“秀”事件......

GtkWindow *w = gtk_window_new(GTK_WINDOW_POPUP); 
g_signal_connect(G_OBJECT(w), "show", G_CALLBACK(on_window_show), NULL); 

...与试图抢键盘的回调:

static void on_window_show(GtkWidget *w, gpointer user_data) { 
    /* grabbing might not succeed immediately... */ 
    while (gdk_keyboard_grab(w->window, FALSE, GDK_CURRENT_TIME) != GDK_GRAB_SUCCESS) { 
     /* ...wait a while and try again */ 
     sleep(0.1); 
    } 
} 

为我工作得很好。

+0

这将独占键盘。用鼠标点击其他程序的窗口不会将键盘焦点传送给它们。有可能会有解决办法,但我不知道任何。 – 2017-04-14 18:15:16