2011-05-05 10 views
2

저는 GTKmm을 사용하는 방법을 배우고 있으며 트리 뷰에 이미지를 넣는 방법을 찾는 데 어려움을 겪고 있습니다. Glade를 사용하여 3 개의 열이있는 treestore를 만들었습니다. 그 중 하나는 이라는 GdkPixbuf입니다. 또한 int_col_pict이라는 pixbuf 셀 렌더러와 char 배열 셀 렌더러를 모두 가지고있는 컬럼이있는 빈틈에 트리 뷰를 만들었습니다. 내 코드에서, 나는 같은 treestore에 대한 일반적인 MyColumns 정의가 :GTKmm - treebuy에 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()을 사용하려고하지만, 실행 시간 I에서 다음 오류가 발생합니다.

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

0

Pixbuf 셀에 명시 적으로 CellRenderer를 설정해야하는 것처럼 보입니다. 이 코드 조각은 각 데이터 행에 CANCEL 아이콘을 표시합니다. 아래 다음과 같이 뭔가를 추가 stock_id 설정 두 줄을 제거해야 표시 사용자 정의 이미지의 경우

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

: 당신이 원하는 모든 각 행에 대해 잠재적으로 다른 주식 아이콘 인 경우

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

, 당신은 그것을 할 수 있습니다 pixbuf 렌더러 속성을 설정합니다. 아이디어는 열에 문자열 스톡 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);