2011-05-05 2 views
2

J'apprends à utiliser GTKmm et j'ai du mal à comprendre comment mettre une image dans une arborescence. J'ai utilisé Glade pour créer un treestore avec 3 colonnes, dont une GdkPixbuf appelée store_pixbuf. J'ai également créé une arborescence dans glade, avec une colonne qui a à la fois un rendu de cellule pixbuf appelé int_col_pict et un rendu de cellule tableau de char. Dans mon code, j'ai la définition MyColumns habituelle pour la treestore comme:GTKmm - Comment mettre un pixbuf dans un treeview

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

et utilise le bit de code suivante pour le remplir.

//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 

J'ai d'abord essayé d'utiliser une image, mais je ne pouvais pas comprendre ce que la fonction que je devais utiliser, alors j'ai essayé d'utiliser Gdk::Pixbuf::create_from_file() (comme vous pouvez le voir ci-dessus), mais lors de l'exécution I l'erreur suivante:

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

Click here pour voir à quoi il ressemble en cours d'exécution. L'image est censé aller sur la même ligne que les lignes « Fast Ethernet ... »

Est-ce que quelqu'un sait comment je peux résoudre ce problème? Est-ce que je vais complètement à tort? Merci d'avoir regardé, chaque petite aide est appréciée!

Répondre

0

Votre code semble correct. J'ai juste codé un exemple rapide et avec gtkmm-2.4, je n'ai aucun problème pour créer une colonne pour un Glib :: RefPtr

Je pose quelques questions: quelle version de gtkmm utilisez-vous? Est-ce que vous ajoutez une colonne dans l'arborescence pour le Pixbuf?

Je ne vais pas poster mon exemple complet, mais les bits correspondants sont les suivants:

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

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

Est-ce que toute aide?

+0

Merci pour votre réponse! J'utilise GTKmm 2.4. Je n'utilisais pas initialement une colonne séparée pour le pixbuf (j'ai vu un tutoriel GTK qui l'a fait ainsi, et j'ai juste supposé que ça marcherait), mais puisque vous l'avez fait différemment, j'ai essayé de le changer dans sa propre colonne. Cela ne fonctionne toujours pas et j'ai le même message d'erreur. – bmw357

0

On dirait qu'il est nécessaire de définir explicitement CellRenderer pour les cellules pixbuf. Cet extrait de code affiche l'icône ANNULER sur chaque ligne de données.

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

Pour afficher des images personnalisées, vous devez supprimer deux lignes réglage stock_id ajouter quelque chose comme ci-dessous:

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

Si tout ce que vous voulez est une icône de valeurs potentiellement différent pour chaque ligne, vous pouvez le faire en définissant un attribut de rendu pixbuf. L'idée est que la colonne contient une chaîne stock-id, que le rendu affiche comme une icône.

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