GTKmm - Как поместить pixbuf в древовидную структуру

Я изучаю, как использовать GTKmm, и мне очень трудно понять, как поместить изображение в древовидную структуру. Я использовал Glade для создания древовидного хранилища с 3 столбцами, один из которых — GdkPixbuf с именем store_pixbuf. Я также создал древовидное представление на поляне со столбцом, в котором есть средство визуализации ячеек pixbuf под названием int_col_pict и средство визуализации ячеек массива символов. В моем коде у меня есть обычное определение MyColumns для хранилища дерева, например:

class MyModelColumns : public Gtk::TreeModel::ColumnRecord
{
   public:
   Gtk::TreeModelColumn<Glib::ustring> store_hostname;
   Gtk::TreeModelColumn<Glib::ustring> store_intname;
   Gtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf> > store_pict;

   MyModelColumns   () { add(store_hostname); add(store_intname); add(store_pict);}
};

и используйте следующий фрагмент кода для его заполнения.

//Get a pointer to the treestore
Glib::RefPtr<Gtk::TreeStore> treestore = Glib::RefPtr<Gtk::TreeStore>::cast_static(builder->get_object("routerTreeStore"));

//make sure the pointer isn't bad
if(treestore){
MyModelColumns columns;

    //populate the first column
    Gtk::TreeRow row= *(treestore->append());
    row[columns.store_hostname] = router->hostname;

    //populate all children
    for(int i=0; i<router->interfaces.size(); i++)
    {   
        //append child row
        Gtk::TreeRow child = *(treestore->append(row.children()));

        //insert data into the row
        child[columns.store_pict] = Gdk::Pixbuf::create_from_file("red_dot.png");
        child[columns.store_intname] = router->interfaces[i].interfaceName;
    }
}//if

Сначала я пытался использовать стоковое изображение, но не мог понять, какую функцию я должен использовать, поэтому я попытался использовать Gdk::Pixbuf::create_from_file() (как вы можете видеть выше), но во время выполнения я получаю следующую ошибку:

Gtk-WARNING **: gtktreestore.c:765: Unable to convert from GdkPixbuf to gtkmm__GdkPixbuf

Нажмите здесь, чтобы посмотреть, как это выглядит при работе. Изображение должно располагаться на той же строке, что и строки «FastEthernet...».

Кто-нибудь знает, как я могу это решить? Я поступаю совершенно неправильно? Спасибо за внимание, любая помощь приветствуется!


person bmw357    schedule 05.05.2011    source источник


Ответы (3)


Ваш код выглядит правильно. Я только что написал быстрый пример, и с gtkmm-2.4 у меня нет проблем с созданием столбца для Glib::RefPtr.

У меня пара вопросов: какую версию gtkmm вы используете? Вы добавляете столбец в древовидную структуру для Pixbuf?

Я не буду публиковать свой полный пример, но соответствующие биты:

в примере.h

  //Tree model columns:
  class ModelColumns : public Gtk::TreeModel::ColumnRecord
  {
  public:

    ModelColumns()
    { add(m_col_store_pict);}
    Gtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf> > m_col_store_pict;

  };

  ModelColumns m_Columns;

в примере.cpp

  //Create the Tree model:
  m_refTreeModel = Gtk::ListStore::create(m_Columns);
  m_TreeView.set_model(m_refTreeModel);

  //Fill the TreeView's model
  Gtk::TreeModel::Row row = *(m_refTreeModel->append());
  row[m_Columns.m_col_store_pict] = Gdk::Pixbuf::create_from_file("/usr/share/icons/gnome/22x22/apps/arts.png");

  row = *(m_refTreeModel->append());
  row[m_Columns.m_col_store_pict] = Gdk::Pixbuf::create_from_file("/usr/share/icons/gnome/22x22/apps/fonts.png");

  row = *(m_refTreeModel->append());
  row[m_Columns.m_col_store_pict] = Gdk::Pixbuf::create_from_file("/usr/share/icons/gnome/22x22/apps/access.png");

  //Add the TreeView's view columns:
  m_TreeView.append_column("Some Picture", m_Columns.m_col_store_pict);

Это какая-то помощь?

person Mark    schedule 05.05.2011
comment
Спасибо за ваш ответ! Я использую GTKmm 2.4. Изначально я не использовал отдельный столбец для pixbuf (я видел учебник по GTK, который делал это таким образом, и я просто предположил, что это сработает), но, поскольку вы сделали это по-другому, я попытался изменить его на собственный столбец. Это все еще не работает, и я получаю то же сообщение об ошибке. - person bmw357; 06.05.2011

Если все, что вам нужно, это потенциально разные значки акций для каждой строки, вы можете сделать это, установив атрибут средства визуализации pixbuf. Идея состоит в том, что столбец содержит строку stock-id, которую визуализатор отображает в виде значка.

// in your class declaration

struct columnsRecord : public Gtk::TreeModel::ColumnRecord {
    ...
    Gtk::TreeModelColumn<std::string>    stockID;   // stock id name
    ...
} treeColumns;

Gtk::CellRendererPixBuf     pixBufRenderer;
... 
// setting up columns
int numcols = treeView.append_column("Icon Column", pixBufRenderer);  // returns # cols after append
treeView.get_column(numcols-1)->add_attribute(pixBufRenderer,"stock-id",treeColumns.stockID)
...
// setting a row
std::string id = good_val ? Gtk::Stock::YES.id : Gtk::Stock::NO.id;
rowiter->set_value(columns.stockID,id);
person ergosys    schedule 30.11.2011

Похоже, необходимо явно установить CellRenderer для ячеек pixbuf. Этот фрагмент кода отображает значок ОТМЕНА в каждой строке данных.

Gtk::CellRendererPixbuf *cross = Gtk::manage(new Gtk::CellRendererPixbuf());
cross->property_stock_id() = Gtk::StockID(Gtk::Stock::CANCEL).get_string();
cross->property_stock_size() = Gtk::ICON_SIZE_BUTTON;
[...]
int cols_count = m_TreeView.append_column("icons", *cross);

Для отображения пользовательских изображений вам нужно удалить две строки настройки stock_id и добавить что-то вроде этого ниже:

Gtk::TreeViewColumn* pColumn = m_TreeView.get_column(cols_count - 1);
if(pColumn) {
  pColumn->add_attribute(cell->property_value(), columns.store_pict);
}
person blaze    schedule 13.10.2011