如何将“输入键”合并到按钮按下事件中

时间:2013-07-16 23:48:14

标签: c gtk

我到处都看了。要么我看起来不够努力,要么就是我缺乏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;

}

我现在需要的是在按下“回车键”时调用“按钮”。 (对不起,如果我听起来多余。)

4 个答案:

答案 0 :(得分:2)

因为我看到你需要在文本框中添加“Enter Button”信号处理程序,而不是按钮。

尝试添加

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

(抱歉,我现在无法检查)

答案 1 :(得分:0)

您应该捕获条目的activate信号,并使回调与按钮点击处理程序的操作相同。

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

答案 2 :(得分:0)

当您有这样的对话框时,GTK提供默认小部件的概念,当您在任何将activates-default属性设置为true的GtkEntry上按Enter时,该小部件会被激活。无需显式连接信号,并且突出显示默认小部件,以便用户可以在按Enter键时查看将激活哪个按钮。要进行设置,请添加以下内容

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

答案 3 :(得分:-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
}