GtkTreeView交替行颜色

3
我无法设置TreeView的交替行颜色,不知道为什么会失败。下面是代码:
MainWindow::MainWindow(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade) :
    Gtk::ApplicationWindow(cobject), refBuilder(refGlade){

    Glib::RefPtr<Gtk::CssProvider> cssProvider = Gtk::CssProvider::create();
    cssProvider->load_from_path("style.css");
    Glib::RefPtr<Gtk::StyleContext> styleContext = Gtk::StyleContext::create();
    Glib::RefPtr<Gdk::Screen> screen = Gdk::Screen::get_default();
    styleContext->add_provider_for_screen(screen, cssProvider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);


    const char* user = "user";
    const char* passwd = "passwd";
    const char* database = "dbname";
    const char* dbhost = "192.168.1.5";

    connection = mysql_init(NULL);

    mysql_real_connect(connection, dbhost, user, passwd, database, 3307, NULL, 0);

    refBuilder->get_widget("m_TreeView1", m_TreeView1);


    m_refTreeModel = Gtk::ListStore::create(m_Columns);
    m_TreeView1->set_model(m_refTreeModel);

    /*Glib::RefPtr<Gtk::StyleContext> context = m_TreeView1->get_style_context();
context->add_class("treeview");
*/

    Affitto* affitti = new Affitto(connection);
    MYSQL_RES* res = affitti->getAll();
    MYSQL_ROW riga;
    Gtk::TreeModel::Row row;

    while ((riga = mysql_fetch_row(res))) 
    {

        row = *(m_refTreeModel->append());
        row[m_Columns.m_col_inqid] = std::stoi(riga[0]);
        row[m_Columns.m_col_cognomenome] = riga[1];
        row[m_Columns.m_col_stabile] = riga[2];
        row[m_Columns.m_col_mese] = std::stoi(riga[3]);
        row[m_Columns.m_col_anno] = std::stoi(riga[4]);
        row[m_Columns.m_col_posteggiopagato] = std::stod(riga[5]);
        row[m_Columns.m_col_affittopagato] = std::stod(riga[6]);
        row[m_Columns.m_col_riscaldamentopagato] = std::stod(riga[7]);
        row[m_Columns.m_col_pagatoil] = riga[8];
        row[m_Columns.m_col_stato] = riga[9];
        row[m_Columns.m_col_osservazioni] = riga[10];
        row[m_Columns.m_col_traslocato] = riga[11];
        row[m_Columns.m_col_diversi] = std::stod(riga[12]);
        row[m_Columns.m_col_affitto] = std::stod(riga[13]);
        row[m_Columns.m_col_posteggio] = std::stod(riga[14]);
        row[m_Columns.m_col_riscaldamento] = std::stod(riga[15]);

    }

    m_TreeView1->append_column("InqID", m_Columns.m_col_inqid);
    m_TreeView1->append_column("Cognome e nome", m_Columns.m_col_cognomenome);
    //m_TreeView1->get_column(1)->set_expand(true);
    m_TreeView1->append_column("Stabile", m_Columns.m_col_stabile);
    m_TreeView1->append_column("Mese", m_Columns.m_col_mese);
    m_TreeView1->append_column("Anno", m_Columns.m_col_anno);
    m_TreeView1->append_column("Posteggio pagato", m_Columns.m_col_posteggiopagato);
    m_TreeView1->append_column("Affitto pagato", m_Columns.m_col_affittopagato);
    m_TreeView1->append_column("Riscaldamento pagato", m_Columns.m_col_riscaldamentopagato);
    m_TreeView1->append_column("Pagato il", m_Columns.m_col_pagatoil);
    m_TreeView1->append_column("Stato", m_Columns.m_col_stato);
    m_TreeView1->append_column("Osservazioni", m_Columns.m_col_osservazioni);
    m_TreeView1->append_column("Traslocato", m_Columns.m_col_traslocato);
    m_TreeView1->append_column("Diversi", m_Columns.m_col_diversi);
    m_TreeView1->append_column("Affitto", m_Columns.m_col_affitto);
    m_TreeView1->append_column("Posteggio", m_Columns.m_col_posteggio);
    m_TreeView1->append_column("Riscaldamento", m_Columns.m_col_riscaldamento);




    mysql_free_result(res);
    mysql_close(connection);



}

这是正确加载的CSS。我在Glade文件中设置了TreeView(treeview)的样式类。

.treeview row:nth-child(even) 
{ 
    background-color: #ff0000; 
}
.treeview row:nth-child(odd)
{
    background-color: #000000;
}

出了什么问题?我试图通过代码设置样式类(注释行),但没有改变。

非常感谢您的帮助!

更新

我放上了我的更新后的代码,请问我错在哪里了吗?

Gtk::CellRendererText* textRenderer = manage(new Gtk::CellRendererText());
    textRenderer->property_editable() = false;
    Gtk::TreeViewColumn *col = manage(new Gtk::TreeViewColumn("InqId", *textRenderer));
    col->add_attribute(*textRenderer, "cell-background-rgba", m_Columns.m_col_inqid);
    m_TreeView1->append_column(*col);
while ((riga = mysql_fetch_row(res))) 
    {

        row = *(m_refTreeModel->append());
        row[m_Columns.m_col_inqid] = std::stoi(riga[0]);

        row[m_Columns.m_col_inqid] = Gdk::Color("#CCCCCC");

    }

感谢您的提前帮助!

这可能是一个 bug 吗? - luna80
.treeview .row:nth-child(even) 我认为你漏掉了一个点(.)在row之前,因为CSS默认不将row识别为元素。 - 9841pratik
谢谢回复,但它不起作用。 - luna80
你能提供在浏览器中加载的视图的HTML结构吗?这可以帮助我们找到解决方案。 - 9841pratik
根据文档,这个已经有一个标准属性了。请查看以下链接。 - 9841pratik
显示剩余3条评论
3个回答

1

有人已经遇到了相同的问题:

你可以编写一个函数,抓取每行的每个单元格并使用已提到的函数,或者在单元格创建时执行此操作,如下所示:

Row Background Color GtkTreeView Widget

注意,他只是使用了错误的函数来设置颜色:

感谢 @ivo s,我使用了错误的属性,我需要“cell-background-gdk”而不是“background-gdk”。感谢帮助。

请使用cell-background-rgba函数,而不是之前提到的cell-background-gdk,因为它已被弃用,迟早会被删除。


我已经看到了这个讨论,但是我无法复现它。我现在更新了我的第一篇帖子,如果你能帮我看看我错在哪里,我非常感谢你。 - luna80

1
如果你想设置行的背景颜色,可以使用 cell-background-gdk。你可以在 这里 阅读更多相关信息。

谢谢,但我不知道如何使用它。我可以设置列的背景颜色,但无法设置整行的背景颜色。你能给我展示一个例子吗?非常感谢您的帮助。 - luna80

1

我现在可以工作了...以下是完整的代码,以防有人遇到同样的问题。 非常感谢那些帮助我的人!

这个模型:

class MainWindow : public Gtk::ApplicationWindow
{
    public:    
        MainWindow(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade);
        virtual ~MainWindow();
        MYSQL* connection;
    protected:
        Glib::RefPtr<Gtk::Builder> refBuilder;


        class ModelColumns : public Gtk::TreeModel::ColumnRecord
        {
            public:

            ModelColumns()
            { 
                add(m_col_inqid);
                add(m_col_cognomenome);
                add(m_col_stabile);
                add(m_col_mese);
                add(m_col_anno);
                add(m_col_posteggiopagato);
                add(m_col_affittopagato);
                add(m_col_riscaldamentopagato);
                add(m_col_pagatoil);
                add(m_col_stato);
                add(m_col_osservazioni);
                add(m_col_traslocato);
                add(m_col_diversi);
                add(m_col_affitto);
                add(m_col_posteggio);
                add(m_col_riscaldamento);
                add(m_coloreriga);
            }


            Gtk::TreeModelColumn<int> m_col_inqid;
            Gtk::TreeModelColumn<std::string> m_col_cognomenome;
            Gtk::TreeModelColumn<std::string> m_col_stabile;
            Gtk::TreeModelColumn<int> m_col_mese;
            Gtk::TreeModelColumn<int> m_col_anno;
            Gtk::TreeModelColumn<double> m_col_posteggiopagato;
            Gtk::TreeModelColumn<double> m_col_affittopagato;
            Gtk::TreeModelColumn<double> m_col_riscaldamentopagato;
            Gtk::TreeModelColumn<std::string> m_col_pagatoil;
            Gtk::TreeModelColumn<std::string> m_col_stato;
            Gtk::TreeModelColumn<std::string> m_col_osservazioni;
            Gtk::TreeModelColumn<std::string> m_col_traslocato;
            Gtk::TreeModelColumn<double> m_col_diversi;
            Gtk::TreeModelColumn<double> m_col_affitto;
            Gtk::TreeModelColumn<double> m_col_posteggio;
            Gtk::TreeModelColumn<double> m_col_riscaldamento;
            Gtk::TreeModelColumn<Gdk::RGBA> m_coloreriga;

        };

        ModelColumns m_Columns;
        Gtk::TreeView* m_TreeView1;
        Glib::RefPtr<Gtk::ListStore> m_refTreeModel;


};

主函数:

MainWindow::MainWindow(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade) :
    Gtk::ApplicationWindow(cobject), refBuilder(refGlade){

    Glib::RefPtr<Gtk::CssProvider> cssProvider = Gtk::CssProvider::create();
    cssProvider->load_from_path("style.css");
    //cssProvider->load_from_data(cssProvider, ".treeview row:nth-child(even){  background-color: #ff0000; } .treeview row:nth-child(odd){ background-color: #000000; }", -1, NULL);
    Glib::RefPtr<Gtk::StyleContext> styleContext = Gtk::StyleContext::create();
    Glib::RefPtr<Gdk::Screen> screen = Gdk::Screen::get_default();
    styleContext->add_provider_for_screen(screen, cssProvider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);


    const char* user = "root";
    const char* passwd = "";
    const char* database = "";
    const char* dbhost = "192.168.1.5";

    connection = mysql_init(NULL);

    mysql_real_connect(connection, dbhost, user, passwd, database, 3307, NULL, 0);

    refBuilder->get_widget("m_TreeView1", m_TreeView1);

    //m_Button_Quit.signal_clicked().connect( sigc::mem_fun(*this, &MainWindow::on_button_quit) );

    m_refTreeModel = Gtk::ListStore::create(m_Columns);
    m_TreeView1->set_model(m_refTreeModel);
Affitto* affitti = new Affitto(connection);    
    MYSQL_RES* res = affitti->getAll();
    MYSQL_ROW riga;
    Gtk::TreeModel::Row row;
Gtk::CellRendererText* textRenderer = manage(new Gtk::CellRendererText());
    Gtk::TreeViewColumn *col = manage(new Gtk::TreeViewColumn("InqId", *textRenderer));
    col->add_attribute(*textRenderer, "cell-background-rgba", m_Columns.m_coloreriga);
    m_TreeView1->append_column(*col);

    textRenderer = manage(new Gtk::CellRendererText());
    col = manage(new Gtk::TreeViewColumn("Cognome e nome", *textRenderer));
    col->add_attribute(*textRenderer, "cell-background-rgba", m_Columns.m_coloreriga);
    m_TreeView1->append_column(*col);
m_TreeView1->append_column("Stabile", m_Columns.m_col_stabile);
    m_TreeView1->append_column("Mese", m_Columns.m_col_mese);
    m_TreeView1->append_column("Anno", m_Columns.m_col_anno);
    m_TreeView1->append_column("Posteggio pagato", m_Columns.m_col_posteggiopagato);
    m_TreeView1->append_column("Affitto pagato", m_Columns.m_col_affittopagato);
    m_TreeView1->append_column("Riscaldamento pagato", m_Columns.m_col_riscaldamentopagato);
    m_TreeView1->append_column("Pagato il", m_Columns.m_col_pagatoil);
    m_TreeView1->append_column("Stato", m_Columns.m_col_stato);
    m_TreeView1->append_column("Osservazioni", m_Columns.m_col_osservazioni);
    m_TreeView1->append_column("Traslocato", m_Columns.m_col_traslocato);
    m_TreeView1->append_column("Diversi", m_Columns.m_col_diversi);
    m_TreeView1->append_column("Affitto", m_Columns.m_col_affitto);
    m_TreeView1->append_column("Posteggio", m_Columns.m_col_posteggio);
    m_TreeView1->append_column("Riscaldamento", m_Columns.m_col_riscaldamento);

 int i=0;
    while ((riga = mysql_fetch_row(res))) 
    {

        row = *(m_refTreeModel->append());
        row[m_Columns.m_col_inqid] = std::stoi(riga[0]);
        row[m_Columns.m_col_cognomenome] = riga[1];
        row[m_Columns.m_col_stabile] = riga[2];
        row[m_Columns.m_col_mese] = std::stoi(riga[3]);
        row[m_Columns.m_col_anno] = std::stoi(riga[4]);
        row[m_Columns.m_col_posteggiopagato] = std::stod(riga[5]);
        row[m_Columns.m_col_affittopagato] = std::stod(riga[6]);
        row[m_Columns.m_col_riscaldamentopagato] = std::stod(riga[7]);
        row[m_Columns.m_col_pagatoil] = riga[8];
        row[m_Columns.m_col_stato] = riga[9];
        row[m_Columns.m_col_osservazioni] = riga[10];
        row[m_Columns.m_col_traslocato] = riga[11];
        row[m_Columns.m_col_diversi] = std::stod(riga[12]);
        row[m_Columns.m_col_affitto] = std::stod(riga[13]);
        row[m_Columns.m_col_posteggio] = std::stod(riga[14]);
        row[m_Columns.m_col_riscaldamento] = std::stod(riga[15]);

        if(i%2 == 0)
            row[m_Columns.m_coloreriga] = Gdk::RGBA("#ff0000");
        else
            row[m_Columns.m_coloreriga] = Gdk::RGBA("#cccccc");
        i++;        
    }





    mysql_free_result(res);
    mysql_close(connection);



}

做得好,恭喜 :) - Mileta Dulovic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接