c++ - 如何在 GTK+ 中创建多个但独立的模式对话框?

标签 c++ c modal-dialog gtk

我有以下代码使用 GTK+ 小部件工具包来显示带有按钮的窗口。单击此按钮将显示一个模式对话框。请注意,对 gtk_dialog_run 的调用将递归地启动主循环的另一个实例,即 on_click 函数将在对话框关闭之前不会返回。

我想要两个这样的顶级窗口,每个窗口都有一个按钮并能够生成自己的模式对话框。显示对话框只会禁用生成它的窗口,并且最多可以同时有两个事件模式对话框,每个顶层窗口一个。

在 win32 中,我可以通过在单独的线程中运行每个顶级窗口来简单地完成此操作。但是,gtk_main 似乎只能从一个线程运行。那么我如何在 GTK+ 中管理多个窗口堆栈(如果可能,又不会牺牲 gtk_dialog_run 的简单性)?

更新:代码现在显示两个窗口并将它们添加到各自的窗口组。

#include <gtk/gtk.h>

struct modal_stack
{
    GtkWindowGroup * group;
    GtkWidget * window;
};

static void on_click(GtkWidget *widget, gpointer sptr)
{
    modal_stack * s = (modal_stack *)sptr;
    GtkWidget * dialog = gtk_file_chooser_dialog_new(
        "Open File", 0, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL,
        GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
    gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(s->window));
    gtk_window_group_add_window(s->group, GTK_WINDOW(dialog));
    gtk_dialog_run (GTK_DIALOG (dialog));
    gtk_window_group_remove_window(s->group, GTK_WINDOW(dialog));
    gtk_widget_destroy(dialog);
}

void create_window(modal_stack & s)
{
    s.group = gtk_window_group_new();
    s.window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    gtk_widget_set_usize(s.window, 200, 200);
    g_signal_connect(G_OBJECT (s.window), "destroy",
        G_CALLBACK(gtk_main_quit), NULL);
    g_signal_connect(G_OBJECT (s.window), "delete_event",
        G_CALLBACK(gtk_main_quit), NULL);

    GtkWidget * button = gtk_button_new ();
    gtk_button_set_label(GTK_BUTTON(button), "show dialog");
    g_signal_connect(G_OBJECT (button), "clicked",
        G_CALLBACK(on_click), (gpointer) &s);
    gtk_widget_show(button);

    gtk_container_add(GTK_CONTAINER (s.window), button);
    gtk_widget_show(s.window);

    gtk_window_group_add_window(s.group, GTK_WINDOW(s.window));
}

int main(int argc, char *argv[])
{
    gtk_init (&argc, &argv);
    modal_stack wnd1, wnd2;
    create_window(wnd1);
    create_window(wnd2);
    gtk_main();
}

最佳答案

将对 gtk_dialog_run 的调用放在由 g_idle_add() 调用的函数中。

关于c++ - 如何在 GTK+ 中创建多个但独立的模式对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2036802/

相关文章:

javascript - 为什么我的模态窗口会自动打开和关闭?

已知大小typedefed数组的c++函数模板特化

c - 避免 2 的幂以实现缓存友好性

c - 简单偏移加密中的段错误

c++ - 快速定点 pow、log、exp 和 sqrt

javascript - jQuery 模态和加载问题

c++ - 将 Crashpad 与 Windows Qt 应用程序集成

c++ - 为什么 enqueueAcquireGLObjects() 会在此 OpenCL 代码中泄漏内存?

c++ - 您如何直接从 Windows 上的物理内存中读取?

javascript - AngularJS - 在 Controller 中打开 $mdDialog