Glade / gtkmm TreeView

В ответ на мой предыдущий вопрос в этом вопросе я добился определенного прогресса и ищу следующий совет. Короче говоря, у меня возникают проблемы с загрузкой Treeview от Glade с помощью приложения gtkmm.

Для начала вот источник. Класс:

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()) Я получаю дерево с одной строкой и двумя пустыми столбцами. Когда я раскомментирую две строки, добавляющие столбцы, я получаю древовидное представление с одной строкой и четырьмя столбцами. Первые два столбца являются пустыми (и имеют размер в соответствии с файлом Glade), а вторые два имеют "Now" а также msg строки (и автоматически подбираются по размеру).

Из этого я понял, что elements.info_columns не связано с elements.treeview_info с помощью elements.liststore_info, Похоже, я просто пропустил шаг, чтобы соединить два. liststore_info указан в качестве модели для treeview_info в файле glade, а также устанавливается в GuiManagerконструктор.

Где разъединение?

1

Решение

Я думаю, вам нужно установить, какое поле списка хранилища должно отображаться в каждом столбце таблицы.

  1. В Glade щелкните правой кнопкой мыши на виджете дерева и выберите Редактировать… (не Редактировать отдельно)
  2. Нажми на иерархия табуляция
  3. Нажмите на столбец
  4. Под Свойства и атрибуты обеспечивать Текст отмечен, и правильный столбец хранилища списка выбран из выпадающего списка (который обновит индекс соответствующим образом.) Для столбцов Pixbuf вы хотите Pixbuf Object вместо Текст.
  5. Повторите для каждого столбца

В вашем случае, я полагаю, вы должны получить индекс 0 для столбца Time, 1 для столбца Message и -1 во всех остальных полях.

Это заполнит текст столбца из выбранного поля в хранилище списка. Я считаю, что это сделано таким образом, чтобы вы могли заполнить другие атрибуты столбца (шрифт, цвет и т. Д.) Через хранилище списков, если хотите.

Вне зависимости от этого, я бы также подумал об изменении Gtk::TreeModelColumn<string> в Gtk::TreeModelColumn<Glib::ustring> как я полагаю, то, как вы сейчас это сделаете, может привести к Glib::ustring каждый раз, когда дерево перерисовывается. Держать это как Glib::ustring с самого начала следует избегать большей части этого преобразования.

4

Другие решения


По вопросам рекламы [email protected]