【问题标题】:Dialog boxes not opening second time. GTK+, Glade and C对话框没有第二次打开。 GTK+、Glade 和 C
【发布时间】:2014-06-30 06:18:58
【问题描述】:

我正在使用 GTK+ 和 Glade 设计一个界面。我使用 glade 创建了一些对话框,并通过 C 代码进行了连接。它们第一次工作得很好,但是当用户试图重用它时,程序停止工作。 命令窗口正在给出

(program_name.exe:1668): GLib-GObject-Warning **: invalid (NULL) pointer instance
(program_name.exe:1688): GLib-Gobject-Critical **: g_signal_connect_data: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed
(program)name.exe:1668): Gtk-CRITICAL **: gtk_widget_show: assertion 'GTK_IS_WIDGET(widget)' failed

这里是代码

GtkWidget *entry_obs_cells[12];
void
on_observation_cells_activate(GtkWidget *widget, gpointer user_data){
GtkWidget *observation_cells;
observation_cells = glade_xml_get_widget (gxml, "dialog3_obs_cells");
GtkWidget *label1, *label2, *label3, *label4, *label5, *label6, *label7, *label8, *label9, *label10, *time_interval;
label1 = glade_xml_get_widget(gxml, "label1");
label2 = glade_xml_get_widget(gxml, "label2_obs_cells");
label3 = glade_xml_get_widget(gxml, "label3_obs_cells");
label4 = glade_xml_get_widget(gxml, "label4_obs_cells");
label5 = glade_xml_get_widget(gxml, "label5_obs_cells");
label6 = glade_xml_get_widget(gxml, "label6_obs_cells");
label7 = glade_xml_get_widget(gxml, "label7_obs_cells");
label8 = glade_xml_get_widget(gxml, "label8_obs_cells");
label9 = glade_xml_get_widget(gxml, "label9_obs_cells");
label10 = glade_xml_get_widget(gxml, "label10_obs_cells");


GtkWidget *button1,*button2;
button1 = glade_xml_get_widget(gxml,"Save_obs_cells");
button2 = glade_xml_get_widget(gxml,"Cancel_obs_cells");

entry_obs_cells[1] = glade_xml_get_widget(gxml, "entry1_obs_cells");
entry_obs_cells[2] = glade_xml_get_widget(gxml, "entry2_obs_cells");
entry_obs_cells[3] = glade_xml_get_widget(gxml, "entry3_obs_cells");
entry_obs_cells[4] = glade_xml_get_widget(gxml, "entry4_obs_cells");
entry_obs_cells[5] = glade_xml_get_widget(gxml, "entry5_obs_cells");
entry_obs_cells[6] = glade_xml_get_widget(gxml, "entry6_obs_cells");
entry_obs_cells[7] = glade_xml_get_widget(gxml, "entry7_obs_cells");
entry_obs_cells[8] = glade_xml_get_widget(gxml, "entry8_obs_cells");
entry_obs_cells[9] = glade_xml_get_widget(gxml, "entry9_obs_cells");
entry_obs_cells[10] = glade_xml_get_widget(gxml, "entry10_obs_cells");
entry_obs_cells[11] = glade_xml_get_widget(gxml, "entry_obs_cells");
entry_obs_cells[12] = glade_xml_get_widget(gxml, "entry12_obs_cells");

gtk_widget_show (observation_cells);
g_signal_connect(GTK_BUTTON(button1), "clicked", G_CALLBACK(on_Save_obs_cells_activate), observation_cells);
g_signal_connect(GTK_BUTTON(button2), "clicked", G_CALLBACK(on_Cancel_obs_cells_activate), NULL);

}

on_Save_obs_cells_activate()
{
    char *record_results=(char*)malloc(500);
    strcpy(record_results,project_dir);
    strcat(record_results,"\\Record_results.txt");
    printf("\n%s\n",record_results);
    FILE *file;
    file = fopen(record_results, "w+");
    fprintf(file, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[11])),gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[11])),gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[1])),gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[2])),gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[3])),gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[4])),gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[5])),gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[6])),gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[7])),gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[8])),gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[9])),gtk_entry_get_text(GTK_ENTRY(entry_obs_cells[10])));
    fclose(file);

}

void
on_Cancel_obs_cells_activate (GtkButton *button, gpointer dialog)
{
    gtk_widget_destroy(dialog);
}

【问题讨论】:

  • 您确定您的显示设置正确吗?然而,我记得在 Ubuntu 中遇到的严重错误就像 gtk 错误。
  • 如果您想重复使用这些小部件(否则它们会被释放),请将 gtk_widget_destroy() 替换为 gtk_widget_hide()
  • @Edenia:设置显示部分我不明白。我正在使用 Windows。
  • @mfro:当我使用默认关闭按钮(右上角)而不是对话框中的“取消”按钮时,问题也存在。
  • 正如 mfro 上面所说,您需要调用 gtk_widget_hide() 而不是 gtk_widget_destroy(),您还需要将 destroy 信号连接到 gtk_widget_hide_on_delete() 以在单击右上角的关闭按钮。 Glade XML 已被弃用,它已被 Gtk 本身包含的GtkBuilder 取代。

标签: c windows gtk glade


【解决方案1】:

正如 mfro 上面所说,您需要调用 gtk_widget_hide() 而不是 gtk_widget_destroy() 还需要将 delete-event 信号连接到 gtk_widget_hide_on_delete() 以在单击顶部的关闭按钮时停止窗口被破坏右上角。

Glade XML 已被弃用,它已被 Gtk 本身包含的GtkBuilder 取代。使用 search 和 replace 将 glade_xml 函数调用更改为相应的 GtkBuilder 应该很容易。如果您在 glade 中创建了 xml 接口描述,它们将毫无问题地与 GtkBuilder 一起使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多