2013-07-16 97 views
2

我已經找遍了所有的地方。要麼我看起來不夠努力,要麼就是缺乏C和GTK +的知識。我正在製作一個類似於按Alt + F2時調用的程序的程序。這僅僅是爲了學習體驗。我做了一個叫做「按鈕」的按鈕,在其中輸入要運行的程序後點擊它。我一整天都在嘗試編程按鈕,以便在按下「回車鍵」時也能正常工作。這是我的程序的一部分,負責調用分配小部件的操作。如何將「輸入密鑰」合併到按鈕按下事件

#include <stdio.h> 
#include <string.h> 
#include <gtk/gtk.h> 

static GtkWidget *entry; 

static gboolean kill_window(GtkWidget *widget, GdkEvent *event, gpointer data) 
{ 
    gtk_main_quit(); 
    return FALSE; 
} 

static void button_press(GtkWidget *widget, gpointer data) 
{ 
    const char *text = gtk_entry_get_text(GTK_ENTRY(entry)); 
    //system("cd" text); 
    //printf("%s\n", text); 
    const char *text2 = "&"; 
    char *concatenation; 
    concatenation = malloc(strlen(text)+2); 
    strcpy(concatenation, text); 
    strcat(concatenation, text2); 
    system(concatenation); 
    gtk_main_quit(); 
} 

int main(int argc, char *argv[]) 
{ 

GtkWidget *window; 
GtkWidget *button; 
GtkWidget *button1; 
GtkWidget *hbox; 


gtk_init(&argc, &argv); 

window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
button = gtk_button_new_with_label("Run"); 
button1 = gtk_button_new_with_label("Cancel"); 
entry = gtk_entry_new(); 
hbox = gtk_vbox_new(FALSE, 2); 

gtk_window_set_title(GTK_WINDOW(window), "Run"); 

g_signal_connect(window, "delete_event", G_CALLBACK(kill_window), NULL) 

g_signal_connect(button, "clicked", G_CALLBACK(button_press), NULL); 

g_signal_connect(button1, "clicked", G_CALLBACK(kill_window), NULL); 
gtk_window_set_resizable(GTK_WINDOW(window), FALSE); 
gtk_window_set_default_size(GTK_WINDOW(window), 250, 100); 
gtk_window_set_decorated(GTK_WINDOW(window), TRUE); 

gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 2); 

gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 2); 
gtk_box_pack_start(GTK_BOX(hbox), button1, FALSE, FALSE, 2); 
gtk_container_add(GTK_CONTAINER(window), hbox); 
gtk_widget_show_all(window); 

gtk_main(); 

return 0; 

}

所有我現在需要的是讓「按鈕」,按「回車鍵」的時候被調用。 (對不起,如果我聽起來多餘)

+0

嘗試添加'g_signal_connect(entry,「activate」,G_CALLBACK(button_press),NULL);'(對不起,我現在不能檢查它) – user1759572

+0

甜!有用!只是想知道,但爲什麼我們必須連接到「入門」eather比「按鈕」? – IC2D

+0

當您按Enter鍵時,重點在於輸入。所以入口處理事件。 – user1759572

回答

2

因此,我看到你需要添加「輸入按鈕」信號處理程序到文本框,而不是按鈕。

嘗試添加

g_signal_connect(entry, "activate", G_CALLBACK(button_press), NULL); 

(對不起,我不能現在檢查)

+0

我應該發佈我的整個代碼嗎? – IC2D

+0

你可以將它粘貼到pastie.org並編輯你的文章。 – user1759572

0

你應該明白你的條目的activate信號,並有回調一樣做你的按鈕單擊處理程序。

g_signal_connect(entry, "activate", G_CALLBACK(button_press), NULL); 
-1

也許我誤解了這個問題,但在C中捕獲了「輸入密鑰」。按以下方式完成。

int enter_key = getch(stdin); 

if(enter_key == '\r') 
{ 
    //Do whatever is necessary. 
} 

的「\ r」被稱爲回車,也可以使用它的octagonal值「\ 015」引用。也可能會返回一個換行符('\ n''\ 012')而不是回車,因此您可能需要執行下列操作。

if(enter_key == '\r' || enter_key == '\n') 
{ 
    //Do whatever is necessary 
} 
+0

這是不行的,因爲任務是捕獲GUI小部件中的回車鍵。 – nos

0

當你有這樣的GTK一個對話框,提供當你按下回車上具有activates-default屬性設置爲true GtkEntry中任何被激活默認控件的概念。沒有必要明確地連接一個信號,並且默認的小部件被突出顯示,以便用戶按下回車鍵時可以看到哪個按鈕將被激活。要設置它添加以下

g_object_set (G_OBJECT (button), "can-default", TRUE, "has-default", TRUE, NULL); 
g_object_set (G_OBJECT (entry), "activates-default", TRUE, NULL); 
/* Could do this instead of the second g_object_set 
    gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE); */ 

你也可以使用gtk_button_new_from_stock,而不是gtk_button_new。您也可以查看g_spawn_command_line_async