如何编程窗口以使用退出键关闭

问题描述 投票:0回答:3

我一直在到处寻找如何使用转义键关闭我的程序。我认为使用 GTK+ 的人并不多。另外,如果要求不是太高,可以告诉我如何使用 Gnome 开发者网站,以便我可以自己找到这些东西吗?谢谢。所以,用退出键关闭窗口,这是我的代码:

#include <stdio.h>
#include <string.h>
#include <gtk/gtk.h>
#include <stdlib.h>
#include <ctype.h>
#include <curses.h>

#define KEY_ESC '\033'

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..");

gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER_ALWAYS);
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);
g_signal_connect(entry, "activate", G_CALLBACK(button_press), NULL);
g_signal_connect(button1, "delete_event", 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;
}
c gtk
3个回答
4
投票

连接到顶层窗口上的

key_press_event
信号:

g_signal_connect(window, "key_press_event", G_CALLBACK(check_escape), NULL);

check_escape
回调将如下所示:

#include <gdk/gdkkeysyms.h>
...
static gboolean check_escape(GtkWidget *widget, GdkEventKey *event, gpointer data)
{
  if (event->keyval == GDK_KEY_Escape) {
    gtk_main_quit();
    return TRUE;
  }
  return FALSE;
}

此外,您不需要

<curses.h>
包含,也不需要
KEY_ESC
定义。

如果您的顶级窗口本质上是一个对话框,您可以考虑使用

GtkDialog
而不是
GtkWindow
。对话框提供常规响应,例如“确定”和“取消”,并使用回车键和转义键调用预期响应。


1
投票

对于您的应用程序,我会考虑使用 GtkDialog 和普通按钮而不是 GtkWindow,这样您只需要测试用户按下按钮时 GTK 设置的对话框的返回变量,而不是设置任何信号处理程序。它还会自动设置它,以便在取消对话框时返回 GTK_RESPONSE_CANCEL,然后您可以销毁窗口。


0
投票

如果有人在 2024 年寻找这个问题,这里有一个更新的解决方案。截至目前,GTK4 中已弃用

Gtk.Dialog
,建议使用
Gtk.Window
,但是您需要实现一些操作,例如按下 Esc 时关闭窗口。这是 Vala 中的一个例子:

public class MyDialog : Gtk.Window {
    public MyDialog(Gtk.Window parent, string title) {
        Object (
            title: title,
            transient_for: parent,
            modal: true,
            destroy_with_parent: true
        );
        add_binding_action(Gdk.Key.Escape, 0, "window.close", null);
    }
}

相关部分是对

add_binding_action
的调用:这里第二个参数
0
代表无 modifier,第三个参数
window.close
是由
Gtk.Window
类定义的操作名称。

© www.soinside.com 2019 - 2024. All rights reserved.