2013-10-03 130 views
0

我有一些文本輸入框和一個列表視圖的空地。我想根據在textentry中輸入的值更改listview的值。我可以如何完成這個?我沒有找到任何好的教程。GTK C Listview更新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> 

這是用來裝載空地FLE林間空地文件。該C文件

#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

這將有助於如果我們能看到你張貼在這裏嘗試過的事情......現在我們不能告訴你的問題是glade,gobject還是其中一個GTK小部件。

不管怎樣,你要使用gtk_builder_get_object()找到窗口小部件,然後連接至任意一個activate信號的條目或條目的text財產notify信號(取決於你是否想把事情發生在按下Enter鍵或而用戶鍵入)。然後在信號處理程序中,您應該以任何想要修改它的方式修改樹視圖。