2011-05-05 24 views
2

我正在學習如何使用GTKmm,並且我很難搞清楚如何將圖像放入樹視圖。我用Glade創建了3列的樹庫,其中一個是GdkPixbuf,名爲store_pixbuf。我還在林間空地創建了一個樹狀視圖,列中既有一個名爲int_col_pict的pixbuf單元格渲染器,也有一個char數組單元格渲染器。在我的代碼,我有喜歡的treestore通常MyColumns定義:GTKmm - 如何在樹視圖中放置一個pixbuf

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 ...」行在同一行上

有誰知道我該如何解決這個問題?我是否完全錯誤?感謝您的期待,每一點幫助表示感謝!

回答

0

您的代碼看起來正確。我剛剛編寫了一個快速示例並使用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); 

是,任何幫助嗎?

+0

感謝您的迴應! 我正在使用GTKmm 2.4。我最初並沒有爲pixbuf使用單獨的列(我看到一個GTK教程就是這樣做的,我只是假設它會起作用),但是由於您做了不同的嘗試,我試圖將其更改爲自己的列。它仍然不起作用,並且我得到相同的錯誤信息。 – bmw357 2011-05-06 00:38:35

0

看起來像是需要爲pixbuf單元顯式設置CellRenderer。 此代碼片段顯示每個數據行上的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); 
} 
1

如果你想要的是一個潛在的不同股票圖標的每一行,你可以做到這一點通過設置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); 
相關問題