c-GTK3+使用gtk_window_get_title时出现分段错误



我目前正在创建一个GUI,该GUI具有每次删除和创建网格的按钮,以模拟进入下一页或上一页。当我第一次转到下一页时,它运行良好,并返回窗口标题的字符串。

然而,一旦我试图回到上一页,

char *titles = gtk_window_get_title(GTK_WINDOW(window))

打印出来(空(并且出现分段故障。我也尝试过将标题更改为static,但没有成功。

我正在使用if (strcmp(titles, PgOne) == 0)来检查用户当前所在的页面,以便程序知道要创建的后续页面。

#include <stdio.h>
#include <string.h>
#include <gtk/gtk.h>
char *PgTwo = "Page 2";
char *PgOne = "Page 1";
static void NewCallback(GtkWidget *grid, gpointer user_data)
{
GtkWidget *gridNew;
GtkWidget *window;
GtkWidget *button;
gridNew = gtk_grid_new();
window = gtk_widget_get_toplevel(grid);
gtk_widget_destroy(grid);
char *titles = gtk_window_get_title(GTK_WINDOW(window));
if (strcmp(titles, PgTwo) == 0)
{
gtk_window_set_title(GTK_WINDOW(window), "Page 1");
gtk_container_add(GTK_CONTAINER(window), gridNew);
button = gtk_button_new_with_label("Next Page");
g_signal_connect_swapped(button, "clicked", G_CALLBACK(NewCallback), grid);
/* Place the button in the grid cell (0, 1), and make it fill Span 2 columns */
gtk_grid_attach(GTK_GRID(grid), button, 0, 1, 2, 1);
button = gtk_button_new_with_label("Quit");
g_signal_connect_swapped(button, "clicked", G_CALLBACK(gtk_widget_destroy), window);
/* Place the Quit button in the grid cell (0, 2), and make it Span 2 columns. */
gtk_grid_attach(GTK_GRID(grid), button, 0, 2, 2, 1);
}
else if (strcmp(titles, PgOne) == 0)
{
gtk_window_set_title(GTK_WINDOW(window), "Page 2");
gtk_container_add(GTK_CONTAINER(window), gridNew);
button = gtk_button_new_with_label("Back to Main Menu");
g_signal_connect_swapped(button, "clicked", G_CALLBACK(NewCallback), grid);
/* Place the Quit button in the grid cell (0, 2), and make it Span 2 columns. */
gtk_grid_attach(GTK_GRID(gridNew), button, 0, 1, 2, 1);
}
// Recursive show all items in window
gtk_widget_show_all(window);
}
static void activate(GtkApplication *app, gpointer user_data)
{
GtkWidget *window;
GtkWidget *grid;
GtkWidget *button;
/* create a new window, and set its title */
window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW(window), "Page 1");
gtk_container_set_border_width(GTK_CONTAINER(window), 100);
/* Here we construct the container that is going pack our buttons */
grid = gtk_grid_new();
/* Pack the container in the window */
gtk_container_add(GTK_CONTAINER(window), grid);
button = gtk_button_new_with_label("Next Page");
g_signal_connect_swapped(button, "clicked", G_CALLBACK(NewCallback), grid);
/* Place the button in the grid cell (0, 1), and make it fill Span 2 columns */
gtk_grid_attach(GTK_GRID(grid), button, 0, 1, 2, 1);
button = gtk_button_new_with_label("Quit");
g_signal_connect_swapped(button, "clicked", G_CALLBACK(gtk_widget_destroy), window);
/* Place the Quit button in the grid cell (0, 2), and make it Span 2 columns. */
gtk_grid_attach(GTK_GRID(grid), button, 0, 2, 2, 1);
// Recursive show all items in window
gtk_widget_show_all(window);
}
// Main function is here
int main(int argc, char **argv)
{
GtkApplication *app;
int status;
app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE);
g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
status = g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return status;
}

我通过将变量grid更改为gridNew解决了这个问题,因为我之前已经调用了gtk_widget_destroy(grid)

g_signal_connect_swapped(button, "clicked", G_CALLBACK(NewCallback), gridNew);

尝试接受我的解决方案,但告诉我要等2天才能接受

最新更新