c - 如何使用 gtk3 在 linux 上的 c 中的窗口之间切换

标签 c linux gtk3

我有一个在 linux 下运行的 c 应用程序 它有一个在启动时加载的窗口(窗口 0) 它应该调用 4 个窗口中的任何一个(窗口 1 - 4)

我的问题是我不知道如何调用辅助窗口并切换到它。

如有任何帮助,我们将不胜感激。

在 S0.glade 中,我有 4 个按钮,每个按钮调用一个 diff 例程,该例程应该加载 4 个窗口之一。

我只是不知道该怎么做。我已经用谷歌搜索了 3 天,但没有找到我需要的东西。尝试了很多但没有运气。 这是我第一次尝试使用 gtk。刚刚从 Windows 下的 VB.net 转移过来,我迷路了......

我的代码在我的主循环中看起来像这样

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

    GtkBuilder      *builder; 

    /* init threads */
    gtk_init(&argc, &argv);

    builder = gtk_builder_new();
    gtk_builder_add_from_file (builder, "S0.glade", NULL);
    gtk_builder_add_from_file (builder, "S1.glade", NULL);
    gtk_builder_add_from_file (builder, "S2.glade", NULL);
    gtk_builder_add_from_file (builder, "S3.glade", NULL);

    window = GTK_WIDGET(gtk_builder_get_object(builder, "Mini"));

    g_lblStatus1 = GTK_WIDGET(gtk_builder_get_object(builder, "lblStatus1"));
    g_lblStatus2 = GTK_WIDGET(gtk_builder_get_object(builder, "lblStatus2"));
    g_lblStatus3 = GTK_WIDGET(gtk_builder_get_object(builder, "lblStatus3"));
    g_lblStatus4 = GTK_WIDGET(gtk_builder_get_object(builder, "lblStatus4"));

    g_T1_Size = GTK_WIDGET(gtk_builder_get_object(builder, "T1_Size"));
    g_T2_Size = GTK_WIDGET(gtk_builder_get_object(builder, "T2_Size"));
    g_T3_Size = GTK_WIDGET(gtk_builder_get_object(builder, "T3_Size"));
    g_T4_Size = GTK_WIDGET(gtk_builder_get_object(builder, "T4_Size"));
    g_T5_Size = GTK_WIDGET(gtk_builder_get_object(builder, "T5_Size"));
    g_T6_Size = GTK_WIDGET(gtk_builder_get_object(builder, "T6_Size"));

    g_S_1_Status = GTK_WIDGET(gtk_builder_get_object(builder, "S_1_Status"));
    g_S_2_Status = GTK_WIDGET(gtk_builder_get_object(builder, "S_2_Status"));
    g_S_3_Status = GTK_WIDGET(gtk_builder_get_object(builder, "S_3_Status"));
    g_S_4_Status = GTK_WIDGET(gtk_builder_get_object(builder, "S_4_Status"));
    g_S_5_Status = GTK_WIDGET(gtk_builder_get_object(builder, "S_5_Status"));
    g_S_6_Status = GTK_WIDGET(gtk_builder_get_object(builder, "S_6_Status"));

    g_P_1 = GTK_WIDGET(gtk_builder_get_object(builder, "P_1"));
    g_P_2 = GTK_WIDGET(gtk_builder_get_object(builder, "P_2"));
    g_P_3 = GTK_WIDGET(gtk_builder_get_object(builder, "P_3"));
    g_P_4 = GTK_WIDGET(gtk_builder_get_object(builder, "P_4"));
    g_P_5 = GTK_WIDGET(gtk_builder_get_object(builder, "P_5"));
    g_P_6 = GTK_WIDGET(gtk_builder_get_object(builder, "P_6"));

    g_V_1 = GTK_WIDGET(gtk_builder_get_object(builder, "V_1"));
    g_V_2 = GTK_WIDGET(gtk_builder_get_object(builder, "V_2"));
    g_V_3 = GTK_WIDGET(gtk_builder_get_object(builder, "V_3"));
    g_V_4 = GTK_WIDGET(gtk_builder_get_object(builder, "V_4"));
    g_V_5 = GTK_WIDGET(gtk_builder_get_object(builder, "V_5"));
    g_V_6 = GTK_WIDGET(gtk_builder_get_object(builder, "V_6"));

    g_CSLN = GTK_WIDGET(gtk_builder_get_object(builder, "CSLN"));
    g_CBLN = GTK_WIDGET(gtk_builder_get_object(builder, "CBLN"));
    g_CS_Volume = GTK_WIDGET(gtk_builder_get_object(builder, "CS_Volume"));
    g_CB_Volume = GTK_WIDGET(gtk_builder_get_object(builder, "CB_Volume"));

    g_Q_1 = GTK_WIDGET(gtk_builder_get_object(builder, "Q_1"));
    g_Q_2 = GTK_WIDGET(gtk_builder_get_object(builder, "Q_2"));
    g_Q_3 = GTK_WIDGET(gtk_builder_get_object(builder, "Q_3"));
    g_Q_4 = GTK_WIDGET(gtk_builder_get_object(builder, "Q_4"));
    g_Q_5 = GTK_WIDGET(gtk_builder_get_object(builder, "Q_5"));
    g_Q_6 = GTK_WIDGET(gtk_builder_get_object(builder, "Q_6"));

     // Images
    g_img1 = (GtkImage *)gtk_builder_get_object(builder, "img1");
    g_img2 = (GtkImage *)gtk_builder_get_object(builder, "img2");
    g_img3 = (GtkImage *)gtk_builder_get_object(builder, "img3");
    g_img4 = (GtkImage *)gtk_builder_get_object(builder, "img4");
    g_img5 = (GtkImage *)gtk_builder_get_object(builder, "img5");
    g_img6 = (GtkImage *)gtk_builder_get_object(builder, "img6");
    g_img7 = (GtkImage *)gtk_builder_get_object(builder, "img7");

    gtk_builder_connect_signals(builder, NULL);
        g_object_unref(builder);
        gtk_widget_show(window);                

        Set_Filler_Images();

        gtk_main();

    return 0;
}

我希望它从 S0.glade 上的按钮调用窗口 1 并激活它。
我展示的编码对于 S1、S2 和 S3 空地文件是通用的。

最佳答案

使用gtk_widget_show_allsignal handler :

#include <gtk/gtk.h>

void clicked(GtkWidget* sender, GtkWindow* window)
{
    gtk_widget_hide(gtk_widget_get_toplevel(sender));
    gtk_widget_show_all(GTK_WIDGET(window));
}

int main (int argc, char *argv[])
{
    gtk_init (&argc, &argv);
    GtkButton* button1, *button2, *button3, *button4;
    GtkWindow* window1, *window2, *window3;
    GtkLabel* label1, *label2, *label3;
    GtkBox *box1, *box2, *box3;

    window1 = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
    window2 = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
    window3 = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
    //----------------------------------------------------
    button1 = GTK_BUTTON(gtk_button_new());
    g_signal_connect(button1, "clicked", G_CALLBACK(clicked), window2);
    button2 = GTK_BUTTON(gtk_button_new());
    g_signal_connect(button2, "clicked", G_CALLBACK(clicked), window3);

    box1 = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL, 0));
    label1 = GTK_LABEL(gtk_label_new("splash"));
    gtk_container_add(GTK_CONTAINER(box1), GTK_WIDGET(label1));
    gtk_container_add(GTK_CONTAINER(box1), GTK_WIDGET(button1));
    gtk_container_add(GTK_CONTAINER(box1), GTK_WIDGET(button2));
    gtk_container_add(GTK_CONTAINER(window1), GTK_WIDGET(box1));
    gtk_widget_show_all(GTK_WIDGET(window1));

    //----------------------------------------------------
    button3 = GTK_BUTTON(gtk_button_new());
    g_signal_connect(button3, "clicked", G_CALLBACK(clicked), window1);

    box2 = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL, 0));
    label2 = GTK_LABEL(gtk_label_new("window1"));
    gtk_container_add(GTK_CONTAINER(box2), GTK_WIDGET(label2));
    gtk_container_add(GTK_CONTAINER(box2), GTK_WIDGET(button3));
    gtk_container_add(GTK_CONTAINER(window2), GTK_WIDGET(box2));

    //----------------------------------------------------
    button4 = GTK_BUTTON(gtk_button_new());
    g_signal_connect(button4, "clicked", G_CALLBACK(clicked), window1);

    box3 = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL, 0));
    label3 = GTK_LABEL(gtk_label_new("window2"));
    gtk_container_add(GTK_CONTAINER(box3), GTK_WIDGET(label3));
    gtk_container_add(GTK_CONTAINER(box3), GTK_WIDGET(button4));
    gtk_container_add(GTK_CONTAINER(window3), GTK_WIDGET(box3));

    //----------------------------------------------------
    gtk_main();
    return 0;
}

关于c - 如何使用 gtk3 在 linux 上的 c 中的窗口之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56260183/

相关文章:

连接()错误: operation not permitted

linux - 如何在 Bash 的 read -p 中换行(添加换行符)?

gtk - 如何在其绘制信号处理程序中获取 GtkDrawingArea 的无效区域

python - 单击 python GTK3 中的按钮后窗口卡住

使用多个线程计算素数

c - 我需要多大的缓冲区?

linux - 从 shell 脚本传递日期到查询

c++ - 如何删除 gtkmm 中自定义 TreeModel 中的 user_data?

c - 如何用指针覆盖内存中结构的第一部分?

python - 安装风筝自动完成软件时在 ubuntu 中出错