2013-10-03 4 views
0

У меня есть поляна с некоторыми текстовыми полями и одним списком. Я хочу изменить значение listview в соответствии со значением, введенным в textentry. Как я могу это сделать? Я не нашел хорошего учебника по этому вопросу.GTK C Listview update dynamicaly

<?xml version="1.0" encoding="UTF-8"?> 
<interface> 
    <!-- interface-requires gtk+ 3.0 --> 
    <object class="GtkAdjustment" id="adjustment1"> 
    <property name="upper">100</property> 
    <property name="step_increment">1</property> 
    <property name="page_increment">10</property> 
    </object> 
    <object class="GtkListStore" id="liststore1"> 
    <columns> 
     <!-- column-name Xaxis --> 
     <column type="gint"/> 
    </columns> 
    <data> 
     <row> 
     <col id="0">0</col> 
     </row> 
    </data> 
    </object> 
    <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="GtkScrolledWindow" id="scrolledwindow1"> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <property name="hadjustment">adjustment1</property> 
      <property name="vadjustment">adjustment1</property> 
      <property name="shadow_type">in</property> 
      <child> 
       <object class="GtkTreeView" id="treeview1"> 
       <property name="visible">True</property> 
       <property name="can_focus">False</property> 
       <property name="model">liststore1</property> 
       <child internal-child="selection"> 
        <object class="GtkTreeSelection" id="treeview-selection1"/> 
       </child> 
       <child> 
        <object class="GtkTreeViewColumn" id="treeviewcolumn1"> 
        <property name="title" translatable="yes">Xaxis</property> 
        <child> 
         <object class="GtkCellRendererSpin" id="cellrendererspin1"> 
         <property name="editable">True</property> 
         <property name="adjustment">adjustment1</property> 
         </object> 
         <attributes> 
         <attribute name="text">0</attribute> 
         </attributes> 
        </child> 
        </object> 
       </child> 
       </object> 
      </child> 
      </object> 
      <packing> 
      <property name="expand">True</property> 
      <property name="fill">True</property> 
      <property name="position">0</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkGrid" id="grid1"> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <child> 
       <object class="GtkLabel" id="label1"> 
       <property name="visible">True</property> 
       <property name="can_focus">False</property> 
       <property name="label" translatable="yes">Value</property> 
       </object> 
       <packing> 
       <property name="left_attach">0</property> 
       <property name="top_attach">0</property> 
       <property name="width">1</property> 
       <property name="height">1</property> 
       </packing> 
      </child> 
      <child> 
       <object class="GtkEntry" id="entry1"> 
       <property name="visible">True</property> 
       <property name="can_focus">True</property> 
       <property name="invisible_char">•</property> 
       </object> 
       <packing> 
       <property name="left_attach">1</property> 
       <property name="top_attach">0</property> 
       <property name="width">1</property> 
       <property name="height">1</property> 
       </packing> 
      </child> 
      </object> 
      <packing> 
      <property name="expand">False</property> 
      <property name="fill">True</property> 
      <property name="position">1</property> 
      </packing> 
     </child> 
     </object> 
    </child> 
    </object> 
</interface> 

Это поляна file.The с файл, используемый для загрузки ПОЛЯНА FLE

#include <gtk/gtk.h> 

void on_window_destroy (GtkWidget *object, gpointer user_data) { 
    gtk_main_quit(); 
} 

int main (int argc, char *argv[]) { 
    GtkBuilder *builder; 
    GtkWidget *window; 

    gtk_init (&argc, &argv); 

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

    window = GTK_WIDGET (gtk_builder_get_object (builder, "window1")); 
    gtk_window_set_default_size (GTK_WINDOW (window), 200, 200); 
    g_signal_connect (window, "destroy", G_CALLBACK (on_window_destroy), NULL); 

    gtk_widget_show (window);  
    gtk_main(); 

    return 0; 
} 
+0

Вы должны уточнить немного, что вы хотите, чтобы изменить значение в TreeView , или добавить к нему новые значения, когда пользователь активирует запись? – erick2red

ответ

0

Надеюсь, это поможет. Это тот же самый код, который вы опубликовали, немного изменили. Здесь определяется обратный вызов, который будет вызываться при the entry is activated. Обратный вызов on_entry_activated, так как вы можете видеть, что значение записи анализируется на целое число и в соответствии с его значением добавляется или заменяет первое значение. Важные детали:

  • объект магазин передается в функцию обратного вызова там в главном функции , так что вы можете изменить его позже.
  • значения в магазине (GtkListStore) манипулируют с помощью GtkTreeIter объектов

в

#include <gtk/gtk.h> 

void on_entry_activated (GtkEntry *entry, gpointer user_data) 
{ 
    gint64 i64; 
    gint i; 
    GtkListStore *store = (GtkListStore*) user_data; 
    GtkTreeIter iter; 

    i64 = g_ascii_strtoll (gtk_entry_get_text (entry), NULL, 10); 
    i = i64; 

    if (i > 0) 
    { 
     gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter); 
    } 
    else 
    { 
     gtk_list_store_append (store, &iter); 
    } 

    gtk_list_store_set (store, &iter, 
       0, i, 
       -1); 

    gtk_entry_set_text (entry, ""); 
} 

void on_window_destroy (GtkWidget *object, gpointer user_data) { 
    gtk_main_quit(); 
} 

int main (int argc, char *argv[]) { 
    GtkBuilder *builder; 
    GtkWidget *window; 

    GtkWidget *entry; 
    GtkListStore *liststore1; 

    gtk_init (&argc, &argv); 

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

    window = GTK_WIDGET (gtk_builder_get_object (builder, "window1")); 
    gtk_window_set_default_size (GTK_WINDOW (window), 200, 200); 
    g_signal_connect (window, "destroy", G_CALLBACK (on_window_destroy), NULL); 

    entry = GTK_WIDGET (gtk_builder_get_object (builder, "entry1")); 
    liststore1 = GTK_LIST_STORE (gtk_builder_get_object (builder, "liststore1")); 
    g_signal_connect (entry, "activate", G_CALLBACK (on_entry_activated), liststore1); 

    gtk_widget_show (window); 
    gtk_main(); 

    return 0; 
} 
+0

Спасибо @ erick2red ваш трюк работал :) – ganeshredcobra

+0

Whatif у меня было более одного я имею в виду более одного окна ввода и аналогичных виджетах – ganeshredcobra

0

Это помогло бы, если бы мы могли видеть, что вы пробовали, прежде чем отправлять сюда ... Теперь мы не можем сообщите, если ваша проблема - это поляна, gobject или один из виджетов GTK.

Во всяком случае, вы хотите использовать gtk_builder_get_object() найти виджеты, а затем подключить либо к activate сигнала записи или notify сигнала для text собственности Входа (в зависимости от того, хотите ли вы вещи происходят на нажатие ввода или пока пользователь вводит). Затем в обработчике сигнала вы должны изменить дерево, каким бы способом вы его не модифицировали.