2014-12-31 12 views
1

Проведя долгое время на поиск ответа, я надеюсь, что кто-то может помочь мне с этой проблемой. Я пытаюсь использовать gtkmm (версия 3.14.0) и glade (версия 3.18.3) в системе Fedora 21 для создания Gtk::TreeView/Gtk::ListStore со многими маленькими изображениями. Я могу легко разместить значки акций в списке, но добавление Gdk::Pixbuf объектов кажется неправильным. Сообщения об ошибках и предупреждениях не отображаются, но изображение Gdk::Pixbuf не отображается.Почему Gdk :: Pixbufs не видны в Gtk :: TreeView?

Чтобы показать проблему, я создал минимальный рабочий пример (код программы и файл поляны, включенный в конце). Запуск этой программы должен открыть небольшое окно с Gtk::TreeView с двумя значками «gtk-apply». В первом столбце должен быть значок, добавленный как Gdk::Pixbuf, во втором столбце должен быть значок фонта. Однако, когда я запускаю программу, первый столбец остается пустым. Ошибок или предупреждений компиляции или времени выполнения не существует.

В моем последнем приложении будет отображаться матрица около 100 строк и около 35 столбцов в основном маленьких значков, позволяющих быстро просмотреть действия, выполненные в разные дни месяца. Ни один из этих значков не будет значком акций.

Экстренная Информация: После выполнения программы с помощью отладчика, я обнаружил, что первая колонка Gtk::ListStore «s хочет данных типа gtkmm__GdkPixbuf. Тип pb в строке row[cols.m_pb] = pb: GdkPixbuf. Тип GdkPixbuf не может быть преобразован в gtkmm__GdkPixbuf автоматически, в результате чего значение будет установлено равным 0 (NULL). Очевидно, это не решает проблему, но может помочь решить проблему.

Спасибо за помощь и наилучшие пожелания на 2015 год, Wim

Это файл mwe.glade:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- Generated with glade 3.18.3 --> 
<interface> 
    <requires lib="gtk+" version="3.12"/> 
    <object class="GtkAccelGroup" id="accelgroup1"/> 
    <object class="GtkApplicationWindow" id="mainwindow"> 
    <property name="can_focus">False</property> 
    <property name="show_menubar">False</property> 
    <child> 
     <object class="GtkGrid" id="mainbox"> 
     <property name="visible">True</property> 
     <property name="can_focus">False</property> 
     <property name="orientation">vertical</property> 
     <child> 
      <object class="GtkTreeView" id="treattree"> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="vexpand">True</property> 
      <property name="hscroll_policy">natural</property> 
      <property name="model">treatstore</property> 
      <property name="rules_hint">True</property> 
      <property name="search_column">0</property> 
      <property name="fixed_height_mode">True</property> 
      <child internal-child="selection"> 
       <object class="GtkTreeSelection" id="sel1"/> 
      </child> 
      <child> 
       <object class="GtkTreeViewColumn" id="col1"> 
       <property name="sizing">fixed</property> 
       <property name="fixed_width">32</property> 
       <property name="title">1</property> 
       <child> 
        <object class="GtkCellRendererPixbuf" id="cell1"> 
        <property name="width">16</property> 
        <property name="height">16</property> 
        </object> 
        <attributes> 
        <attribute name="pixbuf">0</attribute> 
        </attributes> 
       </child> 
       </object> 
      </child> 
      <child> 
       <object class="GtkTreeViewColumn" id="col2"> 
       <property name="sizing">fixed</property> 
       <property name="fixed_width">32</property> 
       <property name="title">2</property> 
       <child> 
        <object class="GtkCellRendererPixbuf" id="cell2"/> 
        <attributes> 
        <attribute name="stock-id">1</attribute> 
        </attributes> 
       </child> 
       </object> 
      </child> 
      </object> 
      <packing> 
      <property name="left_attach">0</property> 
      <property name="top_attach">0</property> 
      </packing> 
     </child> 
     </object> 
    </child> 
    </object> 
    <object class="GtkListStore" id="treatstore"> 
    <columns> 
     <!-- column-name col1 --> 
     <column type="GdkPixbuf"/> 
     <!-- column-name col2 --> 
     <column type="gchararray"/> 
    </columns> 
    </object> 
</interface> 

Файл mwe.cpp:

#include <gtkmm.h> 

namespace ws 
{ 
class App : public Gtk::Application 
{ 
protected: 
    App() : Gtk::Application("nl.mwe.mwe"), m_mainwindow(0) 
    { 
    Glib::set_application_name("MWE"); 
    } 

public: 
    static Glib::RefPtr<App> create(int &argc, char **&argv) 
    { 
    return Glib::RefPtr<App>(new App()); 
    } 
    void init(Glib::RefPtr<Gtk::Builder> builder); 
    int run() 
    { 
    return Gtk::Application::run(*m_mainwindow); 
    } 
private: 
    Gtk::ApplicationWindow *m_mainwindow; 
}; 

// Definition of the column references 
class ModelColumns : public Gtk::TreeModelColumnRecord 
{ 
public: 
    ModelColumns() 
    { 
    add(m_pb); 
    add(m_stock); 
    } 
    Gtk::TreeModelColumn<Glib::RefPtr<Gdk::Pixbuf> > m_pb; 
    Gtk::TreeModelColumn<Glib::ustring> m_stock; 
}; 
static ModelColumns col; 

} // End namespace ws 

/** 
* \brief Initialize the app 
* \param[in]  builder The builder object 
* 
* Here is where the list store is populated with the Gdk::Pixbuf 
*/ 
void ws::App::init(Glib::RefPtr<Gtk::Builder> builder) 
{ 
    builder->get_widget("mainwindow", m_mainwindow); 
    m_mainwindow->show(); 

    Glib::RefPtr<Gtk::ListStore> store = 
    Glib::RefPtr<Gtk::ListStore>::cast_static(
     builder->get_object("treatstore")); 

    Gtk::TreeModel::Row row = *store->append(); 

    // The line below loads the stock icon as a pixbuf. 
    Glib::RefPtr<Gdk::Pixbuf> pb = 
    Gtk::IconTheme::get_default()->load_icon("gtk-apply", 16); 
    row[col.m_pb] = pb; 

    row[col.m_stock] = "gtk-apply"; 
} 

int main (int argc, char *argv[]) 
{ 
    Glib::RefPtr<ws::App> myapp = ws::App::create(argc, argv); 
    Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create(); 
    builder->add_from_file("mwe.glade"); 
    myapp->init(builder); 
    return myapp->run(); 
} 
+0

Я зарегистрировал отчет об ошибке для этой проблемы [https://bugzilla.gnome.org/show_bug.cgi?id=742637]. – sawims

ответ

0

После нахождения проблемы в типах, как показано в Дополнительная информация раздел в вопросе, I d чтобы создать магазин вручную. Определение из GtkListStore было удалено из файла поляны. Метод ws::App::init() был изменен на:

void ws::App::init(Glib::RefPtr<Gtk::Builder> builder) 
{ 
    builder->get_widget("mainwindow", m_mainwindow); 

    Gtk::TreeView *treeview = 0; 
    builder->get_widget("treattree", treeview); 

    Glib::RefPtr<Gtk::ListStore> store = 
    Gtk::ListStore::create(col); 
    treeview->set_model(store); 

    Gtk::TreeModel::Row row = *store->append(); 

    // The line below loads the stock icon as a pixbuf. 
    Glib::RefPtr<Gdk::Pixbuf> pb = 
     Gtk::IconTheme::get_default()->load_icon("gtk-apply", 16); 
    row[col.m_pb] = pb; 

    row[col.m_stock] = "gtk-apply"; 
    m_mainwindow->show(); 
} 

Хотя это не столь гибкой, как хотелось бы, это не исправить эту проблему.