2015-09-11 41 views
1

在回答关于此问题的我的previous question的回答后,我已经取得了一些进展,正在寻找下一个指导。简而言之,我无法通过gtkmm应用程序从Glade加载Treeview。Glade/gtkmm TreeView

要开始,这里的来源。类:

typedef struct 
{ 
    Gtk::Window *window_info; 
    Gtk::TreeView *treeview_info; 
    Glib::RefPtr<Gtk::ListStore> liststore_info; 

    class InfoColumns : public Gtk::TreeModel::ColumnRecord 
    { 
    public: 
     InfoColumns() { add(time); add(message); } 

     Gtk::TreeModelColumn<string> time; 
     Gtk::TreeModelColumn<string> message; 
    } info_columns; 

}UiElements; 

class GuiManager 
{ 
    Glib::RefPtr<Gtk::Builder> builder; 
    UiElements elements; 

    public: 
    GuiManager(); 

    void info_handler(string msg); 
}; 

定义:

GuiManager::GuiManager() 
{ 
    builder = Gtk::Builder::create(); 
    builder->add_from_file("GUI3.glade"); 

    builder->get_widget("window_info", elements.window_info); 
    builder->get_widget("treeview_info", elements.treeview_info); 

//these two methods of loading the liststore appear to function identically 
    elements.liststore_info = Glib::RefPtr<Gtk::ListStore>::cast_dynamic(builder->get_object("liststore_info")); 
// elements.liststore_info = Gtk::ListStore::create(elements.info_columns); 

    elements.treeview_info->set_model(elements.liststore_info); 

//if I append the columns, the data appears at the end of the list 
// elements.treeview_info->append_column("Time", elements.info_columns.time); 
// elements.treeview_info->append_column("Message", elements.info_columns.message); 
} 

void GuiManager::info_handler(string msg) 
{ 
    Gtk::TreeModel::Row row = *(elements.liststore_info->append()); 
    row[elements.info_columns.time] = "Now"; 
    row[elements.info_columns.message] = msg; 
} 

和XML:

<object class="GtkListStore" id="liststore_info"> 
    <columns> 
    <!-- column-name Time --> 
    <column type="gchararray"/> 
    <!-- column-name Message --> 
    <column type="gchararray"/> 
    </columns> 
</object> 
<object class="GtkWindow" id="window_info"> 
    <property name="can_focus">False</property> 
    <property name="title" translatable="yes">Info</property> 
    <child> 
    <object class="GtkScrolledWindow" id="scrolledwindow_info"> 
     <property name="visible">True</property> 
     <property name="can_focus">True</property> 
     <property name="shadow_type">in</property> 
     <property name="min_content_width">400</property> 
     <property name="min_content_height">600</property> 
     <child> 
     <object class="GtkTreeView" id="treeview_info"> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="model">liststore_info</property> 
      <property name="enable_search">False</property> 
      <property name="enable_grid_lines">both</property> 
      <child internal-child="selection"> 
      <object class="GtkTreeSelection" id="treeview_info_selection"/> 
      </child> 
      <child> 
      <object class="GtkTreeViewColumn" id="treeview_info_column_time"> 
       <property name="resizable">True</property> 
       <property name="sizing">autosize</property> 
       <property name="min_width">100</property> 
       <property name="title" translatable="yes">Time</property> 
       <property name="clickable">True</property> 
       <child> 
       <object class="GtkCellRendererText" id="treeview_info_cellrenderer_time"/> 
       </child> 
      </object> 
      </child> 
      <child> 
      <object class="GtkTreeViewColumn" id="treeview_info_column_message"> 
       <property name="resizable">True</property> 
       <property name="sizing">autosize</property> 
       <property name="min_width">300</property> 
       <property name="title" translatable="yes">Message</property> 
       <property name="clickable">True</property> 
       <child> 
       <object class="GtkCellRendererText" id="treeview_info_cellrenderer_message"/> 
       </child> 
      </object> 
      </child> 
     </object> 
     </child> 
    </object> 
    </child> 
</object> 

当我编译并运行该代码(加上一个调用info_handler())我得到一个TreeView一行两空白栏。当我取消注释添加列的两行时,我得到一行和四列的树视图。前两列为空白(根据glade文件大小设置),后两列的字符串为"Now"msg(并根据内容自动调整大小)。

我从这个收集是elements.info_columns不通过elements.liststore_infoelements.treeview_info有关。看起来我只是错过了连接两者的步骤。 liststore_info在林肯档案中被列为treeview_info的模型,以及在GuiManager的构造函数中设置。

断开连接在哪里?

回答

4

我认为你需要设置每个表列中应该显示哪个列表存储字段。

  1. 在格莱德,在树部件用鼠标右键单击,然后单击编辑...(不编辑单独
  2. 单击层次选项卡上
  3. 单击列
  4. 特性和属性确保文本被选中和正确的列表存储器列从下拉列表中选择(它将向上对于Pixbuf列,您想要Pixbuf对象而不是文本
  5. 重复为每列

在你的情况,我相信你应该以0时间列消息列的索引,以及1结束和-1的所有其他领域。

这将填充列表存储中选定字段的列文本。我相信这样做是为了让您可以通过列表存储填充列的其他属性(字体,颜色等),如果您愿意的话。

无关的这一点,我也考虑改变Gtk::TreeModelColumn<string>Gtk::TreeModelColumn<Glib::ustring>,因为我相信你现在的方式可能会导致从每一个树视图重绘自身时间Glib::ustring转换到/。从一开始就将它保持为Glib::ustring应该避免大部分此转换。

+0

就是这样!最后。非常感谢。 =) – musasabi

+1

请注意,gtkmm维护者(例如我)并不希望您能够在glade中定义TreeModel以与gtkmm一起使用。如果它有效,那么你就是幸运。 – murrayc