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;

}

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

4

4 回答 4

3

因此,正如我所见,您需要将“Enter Button”信号处理程序添加到文本框,而不是按钮。

尝试添加

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

(对不起,我现在不能检查)

于 2013-07-16T23:59:43.537 回答
1

您应该捕获条目的激活信号,并让回调执行与您的按钮单击处理程序相同的操作。

   g_signal_connect(entry, "activate", G_CALLBACK(button_press), NULL);
于 2013-07-17T00:12:48.247 回答
0

activates-default当你有一个像这样的对话框时,GTK 提供了一个默认小部件的概念,当你在任何将属性设置为 true的 GtkEntry 上按 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

于 2013-07-18T15:21:43.157 回答
-2

也许我误解了这个问题,但在 C 中捕获“输入键”。按以下方式完成。

int enter_key = getch(stdin);

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

'\r' 称为回车,也可以使用它的八角形值 '\015' 来引用。此外,可能会返回换行符('\n' '\012')而不是回车,因此您可能希望执行以下操作。

if(enter_key == '\r' || enter_key == '\n')
{
   //Do whatever is necessary
}
于 2013-07-17T01:06:45.697 回答