gtkmm Append_column(TreeViewColumn) 啥都不显示

Posted

技术标签:

【中文标题】gtkmm Append_column(TreeViewColumn) 啥都不显示【英文标题】:gtkmm Append_column(TreeViewColumn) display nothinggtkmm Append_column(TreeViewColumn) 什么都不显示 【发布时间】:2018-07-16 07:29:55 【问题描述】:

我正在尝试用不同的颜色为 TreeView 的行着色。 我在网上找到了以下示例,但由于某种原因,列没有出现并且窗口保持为空。

我正在使用 c++gtkmm3

代码如下:

#include <gtkmm.h>

class Columns : public Gtk::TreeModel::ColumnRecord

    public:
        Columns ()  add (name); add (color); add(value); 
        Gtk::TreeModelColumn<Glib::ustring> name;
        Gtk::TreeModelColumn<int> value;
        Gtk::TreeModelColumn<Glib::ustring> color;  // a non-display column to store the color for each row
;

class MyWindow : public Gtk::Window

    public:
        MyWindow() :
            liststore (Gtk::ListStore::create (cols))
        
            // add some random data to the model
            Gtk::TreeModel::Row row = *(liststore->append());
            row[cols.name] = "foo";
            row[cols.value] = 10;
            row[cols.color] = "blue";
            row = *(liststore->append());
            row[cols.name] = "bar";
            row[cols.value] = 20;
            row[cols.color] = "pink";
            row = *(liststore->append());
            row[cols.name] = "baz";
            row[cols.value] = 30;
            row[cols.color] = "green";

            treeview = Gtk::manage(new Gtk::TreeView (liststore));

            // create a view column for 'name' and associate the 'cell-background'
            // property of this column's cellrenderer with the value from the
            // 'color' column
            Gtk::TreeViewColumn viewcolumn("Name", cols.name);
            Gtk::CellRenderer* cellrenderer = viewcolumn.get_first_cell();
            viewcolumn.add_attribute(cellrenderer->property_cell_background (), cols.color);
            treeview->append_column (viewcolumn);

            // do the same for the 'value' column -- cellrenderers are per-
            // column, not per-row, so you have to do this for each column's
            // cellrenderer if you want to change the color of an entire row
            Gtk::TreeViewColumn viewcolumn2("Value", cols.value);
            cellrenderer = viewcolumn2.get_first_cell();
            viewcolumn2.add_attribute(cellrenderer->property_cell_background (), cols.color);
            treeview->append_column (viewcolumn2);

            // add it to the window
            add (*treeview);
            show_all();
        

    private:
        Columns cols;
        Glib::RefPtr<Gtk::ListStore> liststore;
        Gtk::TreeView* treeview;
;

int main (int argc, char** argv)

    auto app = Gtk::Application::create(argc, argv, "org.gtkmm.example");
    MyWindow *myWindow = new MyWindow;
    return app->run(*myWindow);

我错过了什么?我用get_visible()检查,参数设置为true。 编译和执行时没有错误或警告。

编辑: 如果不是创建treeViewColumn,然后将其附加到TreeView 中,而是直接附加名称和列引用,它会显示列,但显然我不能以这种方式修改背景颜色。

要清楚,如果我这样做:

treeview->append_column ("Name", cols.name);

而不是:

Gtk::TreeViewColumn viewcolumn("Name", cols.name);
treeview->append_column (viewcolumn);

【问题讨论】:

【参考方案1】:

这是一个对我有帮助的解决方案。使用Gtk::manage:

Gtk::TreeView::Column *xxx = Gtk::manage(new Gtk::TreeViewColumn("Name", m_Columns.m_col_name));
m_TreeView.append_column(*xxx)

【讨论】:

【参考方案2】:

我对 GTK 一无所知,但这对我来说似乎很可疑

        Gtk::TreeModel::Row row = *(liststore->append());
        row[cols.name] = "foo";
        row[cols.value] = 10;
        row[cols.color] = "blue";

尝试使用参考

        Gtk::TreeModel::Row& row = *(liststore->append());
        row[cols.name] = "foo";
        row[cols.value] = 10;
        row[cols.color] = "blue";

在我看来,您正在添加一行,但随后修改了该行的副本,而不是您添加的那个。

编辑

看过文档后,https://developer.gnome.org/gtkmm/stable/classGtk_1_1ListStore.html 我认为需要这样的东西

        Gtk::ListStore::iterator row = liststore->append();
        (*row)[cols.name] = "foo";
        (*row)[cols.value] = 10;
        (*row)[cols.color] = "blue";

【讨论】:

我试过了,但是使用 row 作为参考会导致与 liststore->append() 绑定和初始化有关的错误 这个修改没有报错,但给出的结果和我的一样

以上是关于gtkmm Append_column(TreeViewColumn) 啥都不显示的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 gtkmm 在 TreeView 中使单个项目变为粗体?

GTKmm 的 CMake 错误 - 找不到包 'gtkmm-3.0'

gtkmm 编译错误

用 Gtkmm 创建一个网格向量

适用于 Mac OS X 的 gtkmm-2.4-dev

编译gtkmm的问题