(GtkTest.exe:15164):Gtk-CRITICAL **:gtk_list_store_set_valist:断言`GTK_IS_LIST_STORE(list_store)'失败

时间:2016-07-21 07:46:29

标签: multithreading gtk assertion

当我尝试使用gtk_list_store_set()函数时出现此错误。 整个程序是这样的: 1.首先,使用gtk_builder使用a4.glade文件构建UI。 2.其次,得到按钮的GObject并将信号链接到函数调用" print_hello" 3.第三,获得GtkTreeView的GObject并初始化它。

print_hello函数正在尝试修改GtkTreeModel的list_store。主要目的是修改GtkTreeView的单元格数据。

  

Hello World

     

Step1 model = gtk_tree_view_get_model(this-> treeview);第二步
  gtk_tree_model_get_iter_first(model,& iter);

     

(GtkTest.exe:15164):Gtk-CRITICAL **:gtk_list_store_set_valist:   断言`GTK_IS_LIST_STORE(list_store)'失败

main.c的代码

#include <gtk/gtk.h>

//Start Data Definition
typedef struct
{
  const gboolean  fixed;
  const guint     number;
  const gchar    *severity;
  const gchar    *description;
}Bug;
enum{
  COLUMN_FIXED,
  COLUMN_NUMBER,
  COLUMN_SEVERITY,
  COLUMN_DESCRIPTION,
  COLUMN_PULSE,
  COLUMN_ICON,
  COLUMN_ACTIVE,
  COLUMN_SENSITIVE,
  NUM_COLUMNS
};
static Bug data[] ={
  { FALSE, 60482, "Normal",     "scrollable notebooks and hidden tabs" },
  { FALSE, 60620, "Critical",   "gdk_window_clear_area (gdkwindow-win32.c) is not thread-safe" },
  { FALSE, 50214, "Major",      "Xft support does not clean up correctly" },
  { TRUE,  52877, "Major",      "GtkFileSelection needs a refresh method. " },
  { FALSE, 56070, "Normal",     "Can't click button after setting in sensitive" },
  { TRUE,  56355, "Normal",     "GtkLabel - Not all changes propagate correctly" },
  { FALSE, 50055, "Normal",     "Rework width/height computations for TreeView" },
  { FALSE, 58278, "Normal",     "gtk_dialog_set_response_sensitive () doesn't work" },
  { FALSE, 55767, "Normal",     "Getters for all setters" },
  { FALSE, 56925, "Normal",     "Gtkcalender size" },
  { FALSE, 56221, "Normal",     "Selectable label needs right-click copy menu" },
  { TRUE,  50939, "Normal",     "Add shift clicking to GtkTextView" },
  { FALSE, 6112,  "Enhancement","netscape-like collapsable toolbars" },
  { FALSE, 1,     "Normal",     "First bug :=)" },
};
//End Data Definition
static void fixed_toggled (GtkCellRendererToggle *cell,
                                           gchar *path_str,
                                        gpointer  data){
  GtkTreeModel *model = (GtkTreeModel*) data;
  GtkTreeIter  iter;
  GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
  gboolean fixed;

  /* get toggled iter */
  gtk_tree_model_get_iter (model, &iter, path);
  gtk_tree_model_get (model, &iter, COLUMN_FIXED, &fixed, -1);

  /* do something with the value */
  fixed ^= 1;

  /* set new value */
  gtk_list_store_set (GTK_LIST_STORE (model), &iter, COLUMN_FIXED, fixed, -1);

  /* clean up */
  gtk_tree_path_free (path);
}


GObject *treeview;

void initTreeView(){
    GtkTreeModel *model;

    //Create Data
    gint i = 0;
    GtkListStore *store;
    GtkTreeIter iter;

  /* create list store */
  store = gtk_list_store_new (NUM_COLUMNS,
                              G_TYPE_BOOLEAN,
                              G_TYPE_UINT,
                              G_TYPE_STRING,
                              G_TYPE_STRING,
                              G_TYPE_UINT,
                              G_TYPE_STRING,
                              G_TYPE_BOOLEAN,
                              G_TYPE_BOOLEAN);

    /* add data to the list store */
    for (i = 0; i < G_N_ELEMENTS (data); i++){
        gchar *icon_name;
        gboolean sensitive;

      if (i == 1 || i == 3)
        icon_name = "battery-caution-charging-symbolic";
      else
        icon_name = NULL;
      if (i == 3)
        sensitive = FALSE;
      else
        sensitive = TRUE;
      gtk_list_store_append (store, &iter);
      gtk_list_store_set (store, &iter,
                          COLUMN_FIXED, data[i].fixed,
                          COLUMN_NUMBER, data[i].number,
                          COLUMN_SEVERITY, data[i].severity,
                          COLUMN_DESCRIPTION, data[i].description,
                          COLUMN_PULSE, 0,
                          COLUMN_ICON, icon_name,
                          COLUMN_ACTIVE, FALSE,
                          COLUMN_SENSITIVE, sensitive,
                          -1);
    }

    model=GTK_TREE_MODEL(store);
    //model=gtk_tree_view_get_model((GtkTreeView*)treeview);
    gtk_tree_view_set_model((GtkTreeView*)treeview, model);


    GtkCellRenderer* renderer;
    GtkTreeViewColumn *column;

    renderer=gtk_cell_renderer_toggle_new ();
    g_signal_connect (renderer, "toggled",G_CALLBACK (fixed_toggled), model);   
    column = gtk_tree_view_column_new_with_attributes ("Fixed?",renderer,"active", COLUMN_FIXED,NULL);

    /* set this column to a fixed sizing (of 50 pixels) */
    gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column),GTK_TREE_VIEW_COLUMN_FIXED);
    gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
    gtk_tree_view_append_column ((GtkTreeView*)treeview, column);
    /* column for bug numbers */
    renderer = gtk_cell_renderer_text_new ();
    column = gtk_tree_view_column_new_with_attributes ("Bug number",renderer,"text",COLUMN_NUMBER,NULL);
    gtk_tree_view_column_set_sort_column_id (column, COLUMN_NUMBER);
    gtk_tree_view_append_column ((GtkTreeView*)treeview, column);

    renderer = gtk_cell_renderer_text_new ();
    column = gtk_tree_view_column_new_with_attributes ("COLUMN_DESCRIPTION",renderer,"text",COLUMN_DESCRIPTION,NULL);
    gtk_tree_view_column_set_sort_column_id (column, COLUMN_DESCRIPTION);
    gtk_tree_view_append_column ((GtkTreeView*)treeview, column);


    //GtkTreeIter iter;
    gboolean valid;
    gint row_count = 0;
    valid = gtk_tree_model_get_iter_first (model,&iter);
    gtk_list_store_set (store, &iter,
                          COLUMN_FIXED, data[i].fixed,
                          COLUMN_NUMBER, 20,
                          COLUMN_SEVERITY, data[i].severity,
                          COLUMN_DESCRIPTION, "sgdfrgs",
                          COLUMN_PULSE, 0,
                          COLUMN_ICON, "battery-caution-charging-symbolic",
                          COLUMN_ACTIVE, FALSE,
                          COLUMN_SENSITIVE, TRUE,
                          -1);
}
void on_window_destroy (GtkWidget *object, gpointer user_data) {
    gtk_main_quit();
}
static void print_hello (GtkWidget *widget, gpointer data){
    g_print ("Hello World\n");

    GtkTreeModel *model;
    //Create Data
    gint i = 0;
    GtkListStore *store;
    GtkTreeIter iter;

    gchar *str_data;
    gint   int_data;
    // Make sure you terminate calls to gtk_tree_model_get() with a “-1” value

    model=gtk_tree_view_get_model((GtkTreeView*)treeview);
    g_print("\n\nStep1     model=gtk_tree_view_get_model(this->treeview);\n");

    gboolean error = gtk_tree_model_get_iter_first (model,&iter);
    gchar *str_data2;
        gint   int_data2;

        // Make sure you terminate calls to gtk_tree_model_get() with a “-1” value
        gtk_tree_model_get (model, &iter,
                       COLUMN_DESCRIPTION, &str_data2,
                       COLUMN_NUMBER, &int_data2,
                       -1);
    g_print("Step2     gtk_tree_model_get_iter_first (model,&iter);\n",error);

    //gdk_threads_enter(); 
    gtk_list_store_set (store, &iter,
                          COLUMN_FIXED, TRUE,
                          COLUMN_NUMBER, int_data2 + 3,
                          COLUMN_SEVERITY, FALSE,
                          COLUMN_DESCRIPTION, "ABCABC bbc bbc",
                          COLUMN_PULSE, 0,
                          COLUMN_ICON, "battery-caution-charging-symbolic",
                          COLUMN_ACTIVE, FALSE,
                          COLUMN_SENSITIVE, TRUE,
                          -1);
    //gdk_threads_leave();

    // Before it is success!

    int row_count=0;
    gboolean valid=TRUE;
    while (valid){
        gchar *str_data;
        gint   int_data;

        // Make sure you terminate calls to gtk_tree_model_get() with a “-1” value
        gtk_tree_model_get (model, &iter,
                       COLUMN_DESCRIPTION, &str_data,
                       COLUMN_NUMBER, &int_data,
                       -1);
        // Do something with the data
        g_print ("Row %d: (%s,%d)\n",row_count, str_data, int_data);
        g_free (str_data);
        valid = gtk_tree_model_iter_next (model,&iter);

        row_count++;
    }

}


int main(int argc, char** argv) {
    GtkWidget *window;
    GObject *button;
    GtkBuilder *builder;

    gtk_init (&argc, &argv);

    builder = gtk_builder_new ();
    gtk_builder_add_from_file (builder, "a4.glade", NULL);

    window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
    button = gtk_builder_get_object (builder, "button1");
    treeview = gtk_builder_get_object (builder, "treeview3");

    initTreeView();

    g_signal_connect (window, "destroy", G_CALLBACK (on_window_destroy), NULL);
    g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);

    gtk_widget_show (window);
    gtk_main (); 

    return 0;
}

a4.glade的代码

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <!-- interface-requires gtk+ 3.0 -->
  <object class="GtkWindow" id="window1">
    <property name="can_focus">False</property>
    <child>
      <object class="GtkBox" id="box1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkTreeView" id="treeview3">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <child internal-child="selection">
              <object class="GtkTreeSelection" id="treeview-selection1"/>
            </child>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="button1">
            <property name="label" translatable="yes">button</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

1 个答案:

答案 0 :(得分:0)

store变量未在print_hello()中初始化。您可能想要完全删除商店并使用

gtk_list_store_set (GTK_LIST_STORE (model), &iter,
                    ...
                    -1);

虽然这部分代码的意图并不是很明显。

&#34; -Wall&#34;编译器标志是你的朋友:我确定它会抱怨这个问题。