【问题标题】:GTKmm - How to put a pixbuf in a treeviewGTKmm - 如何将 pixbuf 放入树视图中
【发布时间】:2011-05-05 07:48:37
【问题描述】:

我正在学习如何使用 GTKmm,但我很难弄清楚如何将图像放入树视图中。我使用 Glade 创建了一个包含 3 列的树存储,其中之一是名为 store_pixbufGdkPixbuf。我还在林间空地创建了一个树视图,其中有一列同时包含一个名为 int_col_pict 的 pixbuf 单元格渲染器和一个字符数组单元格渲染器。在我的代码中,我对树存储有通常的 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

Click here 看看它运行的样子。该图像应该与“FastEthernet...”行在同一行

有谁知道我该如何解决这个问题?我完全错了吗?感谢您的关注,感谢您的每一点帮助!

【问题讨论】:

    标签: c++ glade gtkmm gtktreeview gdkpixbuf


    【解决方案1】:

    您的代码看起来正确。我刚刚编写了一个简单的示例,使用 gtkmm-2.4,为 Glib::RefPtr 创建列没有问题

    我有几个问题:您使用的是哪个版本的 gtkmm?您是否在树视图中为 Pixbuf 添加一列?

    我不会发布我的完整示例,但相关的部分是:

    在example.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;
    

    在example.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);
    

    这有什么帮助吗?

    【讨论】:

    • 感谢您的回复!我正在使用 GTKmm 2.4。我最初并没有为 pixbuf 使用单独的列(我看到一个 GTK 教程就是这样做的,我只是认为它会起作用),但由于你的做法不同,我尝试将其更改为它自己的列。它仍然不起作用,我收到相同的错误消息。
    【解决方案2】:

    如果您想要的只是每行可能不同的股票图标,您可以通过设置 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);
    

    【讨论】:

      【解决方案3】:

      看起来有必要为 pixbuf 单元显式设置 CellRenderer。 此代码 sn-p 在每个数据行上显示 CANCEL 图标。

      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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多