我有一个在 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_all在 signal 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/