我正在学习如何使用GTKmm,我很难搞清楚如何将图像放入树视图中。我使用Glade创建了一个包含3列的树库,其中一列是名为GdkPixbuf
的{{1}}。我还在林间空地创建了一个树视图,其中一个列包含一个名为store_pixbuf
的pixbuf单元格渲染器和一个char数组单元格渲染器。在我的代码中,我对树库的通常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()
Click here看看它的运行情况。图像应该与“FastEthernet ...”行
在同一行有谁知道如何解决这个问题?我完全错了吗?感谢您的关注,感谢每一点帮助!
答案 0 :(得分: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);
答案 1 :(得分:0)
您的代码看起来是正确的。我刚刚编写了一个快速示例并使用gtkmm-2.4,我没有问题为Glib :: RefPtr创建一个列
我有几个问题:您使用的是什么版本的gtkmm?您是否在pixview中为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);
这有什么帮助吗?
答案 2 :(得分: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);
}