2013-05-10 6 views
0

Предположим, у меня есть TreeView (с поддержкой TreeStore), который представляет список продуктов.Различные модели для разных уровней TreeView узлов

продукт имеет следующие характеристики:

  1. Имя
  2. Номер Каталога
  3. Комментарий

Кроме того, каждый продукт имеет список компонентов, которые он построен из. Я хочу отображать данные о компонентах в под-узлах дерева (так было бы, в основном, двухуровневое древовидное представление), но тогда узлы верхнего уровня будут иметь другую модель подузлов.

Как это сделать, используя Glade (или, если это необходимо, через Python + PyGObjecy)?

+0

Я думаю, вы можете, возможно, сопоставляя каждую видимость CellRenderer с другим столбцом в модели. Но точный способ сделать это зависит от того, как должна выглядеть ваша презентация. Можете ли вы подключить TreeView, как хотите? – Havok

ответ

2

У вас может быть только одна модель для TreeView, но вы можете создать модель, которая в действительности представляет собой две (или более) модели, склеенные вместе, и добавить несколько логических столбцов, которые будут контролировать, какую модель должна отображать эта строка. Затем вы добавляете набор CellRenderers и сопоставляете его видимость с этими контрольными столбцами.

Сложность этого заключается в том, когда вы хотите, чтобы столбец имел имя, отображаемое сверху, в этом случае может быть сложно заказать информацию. Если вы можете каркас, как вы хотите, чтобы дерево выглядело, я могу предложить базовый пример реализации.

== EDIT ==

Это один пример:

main.py:

from gi.repository import Gtk 
from os.path import abspath, dirname, join 

WHERE_AM_I = abspath(dirname(__file__)) 

# My Model map 
mm = { 
    'name'  : 0, 
    'catalog_num' : 1, 
    'comment'  : 2, 
    'component' : 3, 
    'is_top'  : 4, 
    'is_child' : 5, 
} 

class MyApp(object): 

    def __init__(self): 
     """ 
     Build GUI 
     """ 

     # Build GUI from Glade file 
     self.builder = Gtk.Builder() 
     self.glade_file = join(WHERE_AM_I, 'gui.glade') 
     self.builder.add_from_file(self.glade_file) 

     # Get objects 
     go = self.builder.get_object 
     self.window = go('window') 
     self.treestore = go('treestore') 

     # Fill model 
     self._load_model() 

     # Connect signals 
     self.builder.connect_signals(self) 
     self.window.connect('delete-event', lambda x,y: Gtk.main_quit()) 

     # Everything is ready 
     self.window.show() 


    def _load_model(self): 

     my_data = [ 
       ['Cheese', 'F001', 'This is the best cheese ever!', '', True, False], 
       ['Pepperoni', 'F002', 'Delicious pepperoni :}', '', True, False], 
       ['Pepperonni Pizza', 'P001', 'Yes, I\'m hungry :(', '', True, False], 
       ['', '', None, 'Cheese', False, True], 
       ['', '', None, 'Pepperonni', False, True], 
      ] 

     parent = None 
     for i in my_data: 
      if i[mm['is_child']]: 
       self.treestore.append(parent, i) 
      else: 
       parent = self.treestore.append(None, i) 


if __name__ == '__main__': 
    gui = MyApp() 
    Gtk.main() 

gui.glade:

<?xml version="1.0" encoding="UTF-8"?> 
<interface> 
    <!-- interface-requires gtk+ 3.0 --> 
    <object class="GtkTreeStore" id="treestore"> 
    <columns> 
     <!-- column-name name --> 
     <column type="gchararray"/> 
     <!-- column-name catalog_num --> 
     <column type="gchararray"/> 
     <!-- column-name comment --> 
     <column type="gchararray"/> 
     <!-- column-name component --> 
     <column type="gchararray"/> 
     <!-- column-name is_top --> 
     <column type="gboolean"/> 
     <!-- column-name is_child --> 
     <column type="gboolean"/> 
    </columns> 
    </object> 
    <object class="GtkWindow" id="window"> 
    <property name="can_focus">False</property> 
    <property name="border_width">10</property> 
    <property name="title" translatable="yes">TreeView test</property> 
    <property name="window_position">center-always</property> 
    <property name="default_width">400</property> 
    <property name="default_height">300</property> 
    <child> 
     <object class="GtkScrolledWindow" id="scrolledwindow"> 
     <property name="visible">True</property> 
     <property name="can_focus">True</property> 
     <property name="shadow_type">in</property> 
     <child> 
      <object class="GtkTreeView" id="treeview"> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="model">treestore</property> 
      <property name="headers_visible">False</property> 
      <property name="headers_clickable">False</property> 
      <property name="search_column">1</property> 
      <property name="tooltip_column">2</property> 
      <child internal-child="selection"> 
       <object class="GtkTreeSelection" id="treeview-selection"/> 
      </child> 
      <child> 
       <object class="GtkTreeViewColumn" id="treeviewcolumn_name"> 
       <property name="title" translatable="yes">Name</property> 
       <child> 
        <object class="GtkCellRendererText" id="cellrenderertext_name"/> 
        <attributes> 
        <attribute name="visible">4</attribute> 
        <attribute name="text">0</attribute> 
        </attributes> 
       </child> 
       <child> 
        <object class="GtkCellRendererText" id="cellrenderertext_component"/> 
        <attributes> 
        <attribute name="visible">5</attribute> 
        <attribute name="text">3</attribute> 
        </attributes> 
       </child> 
       </object> 
      </child> 
      <child> 
       <object class="GtkTreeViewColumn" id="treeviewcolumn_catalog_num"> 
       <property name="title" translatable="yes">Catalog #</property> 
       <child> 
        <object class="GtkCellRendererText" id="cellrenderertext_catalog"/> 
        <attributes> 
        <attribute name="visible">4</attribute> 
        <attribute name="text">1</attribute> 
        </attributes> 
       </child> 
       </object> 
      </child> 
      </object> 
     </child> 
     </object> 
    </child> 
    </object> 
</interface> 

код может также можете найти: https://gist.github.com/carlos-jenkins/5555283

+0

Спасибо большое :) –

Смежные вопросы