如何为弹出的Gtk.窗口提供键盘焦点
我有一个弹出窗口(使用window\u POPUP类型创建),其中包含一些小部件,包括一个文本条目。问题是,当我单击条目时,它没有获得焦点,因此我无法键入任何内容。是否需要设置任何标志以允许窗口获得键盘焦点?如何为弹出的Gtk.窗口提供键盘焦点,gtk,Gtk,我有一个弹出窗口(使用window\u POPUP类型创建),其中包含一些小部件,包括一个文本条目。问题是,当我单击条目时,它没有获得焦点,因此我无法键入任何内容。是否需要设置任何标志以允许窗口获得键盘焦点?\include #include <gtk/gtk.h> static gboolean delete_event( GtkWidget *widget, GdkEvent *event,
\include
#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;
}
静态gboolean delete_事件(GtkWidget*小部件,
GdkEvent*事件,
gpointer数据)
{
g_print(“发生删除事件”);
gtk_main_quit();
返回TRUE;
}
静态无效销毁(GtkWidget*小部件,
gpointer数据)
{
gtk_main_quit();
}
int main(int argc,
字符*argv[]
{
GtkWidget*窗口;
GtkWidget*窗口弹出窗口;
GtkWidget*按钮;
gtk_init(&argc,&argv);
/*创建一个新窗口*/
窗口=gtk_窗口_新建(gtk_窗口_顶层);
windowpopup=gtk_window_new(gtk_window_顶层);
gtk_窗口设置(gtk_窗口(窗口弹出)、gtk_窗口(窗口));
gtk_窗口_设置_销毁_与_父项(gtk_窗口(windowpopup),TRUE);
gtk_小部件_显示(窗口弹出窗口);
g_信号连接(g_对象(窗口),“删除事件”,
G_回调(删除_事件),NULL);
g_信号连接(g_对象(窗口),“销毁”,
G_回调(销毁),空);
/*创建一个标签为“Hello World”的新按钮*/
button=gtk_button_new_,带_标签(“Hello World”);
g_信号连接交换(g_对象(按钮),“点击”,
G_回调(gtk_widget_destroy),
G_对象(窗口));
gtk_容器添加(gtk_容器(窗口),按钮);
gtk_小部件_显示(按钮);
gtk_widget_show(窗口);
gtk_main();
返回0;
}
对于需要焦点的gtk窗口,不能使用窗口弹出窗口。相反,您应该使用GTK_WINDOW_TOPLEVEL类型的GtkWindow并调用下一个函数(或方法)
这对我有用。。。不幸的是,当此“弹出窗口”被销毁时,窗口列表中的图标会短时间闪烁尽管有前面的答案和GTK参考,但在使用GTK_窗口弹出窗口时仍有可能获取键盘焦点。您需要连接到“show”活动 。。。通过尝试抓取键盘的回调:
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);
}
}
这对我来说非常有效。这将独占键盘。用鼠标单击其他程序的窗口不会将键盘焦点转移到它们。可能有工作,但我不知道有。
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);
}
}