В ответ на мой предыдущий вопрос в этом вопросе я добился определенного прогресса и ищу следующий совет. Короче говоря, у меня возникают проблемы с загрузкой 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
конструктор.
Где разъединение?
Я думаю, вам нужно установить, какое поле списка хранилища должно отображаться в каждом столбце таблицы.
В вашем случае, я полагаю, вы должны получить индекс 0 для столбца Time, 1 для столбца Message и -1 во всех остальных полях.
Это заполнит текст столбца из выбранного поля в хранилище списка. Я считаю, что это сделано таким образом, чтобы вы могли заполнить другие атрибуты столбца (шрифт, цвет и т. Д.) Через хранилище списков, если хотите.
Вне зависимости от этого, я бы также подумал об изменении Gtk::TreeModelColumn<string>
в Gtk::TreeModelColumn<Glib::ustring>
как я полагаю, то, как вы сейчас это сделаете, может привести к Glib::ustring
каждый раз, когда дерево перерисовывается. Держать это как Glib::ustring
с самого начала следует избегать большей части этого преобразования.