wxDataViewListCtrl更改单元格背景色

时间:2020-10-04 11:13:30

标签: c++ wxwidgets

作为标题,可以更改wxDataViewListCtrl中单个单元格的背景颜色吗?如果没有,是否可以更改整行的背景颜色? 我该怎么做?其他解决方案? 在此先多谢一些建议

2 个答案:

答案 0 :(得分:1)

您可以在自定义模型中覆盖wxDataViewListModel::GetAttrByRow(),以返回任何单元格所需的颜色(和字体等)属性。

答案 1 :(得分:0)

对于那些可能感兴趣的人,我已经解决了以下问题

  1. 扩展wxDataViewCustomRenderer
class MyColorRenderer: public wxDataViewCustomRenderer
{
public:
    explicit MyColorRenderer(wxDataViewCellMode mode) : wxDataViewCustomRenderer("string", mode, wxALIGN_CENTER)
    { 
  }
    virtual bool Render( wxRect rect, wxDC *dc, int state ) override;

    virtual bool ActivateCell(const wxRect& WXUNUSED(cell), wxDataViewModel*WXUNUSED(model), const wxDataViewItem &WXUNUSED(item), unsigned int WXUNUSED(col), const wxMouseEvent *mouseEvent) override
    {
        return false;
    }
    virtual wxSize GetSize() const override
    {
        return wxSize(60,20);
    }

    virtual bool SetValue( const wxVariant &value ) override
    {
        m_value = value.GetString();
        return true;
    }

    virtual bool GetValue( wxVariant &WXUNUSED(value) ) const override { return true; }
    virtual bool HasEditorCtrl() const override { return true; }

    virtual wxWindow*
    CreateEditorCtrl(wxWindow* parent, wxRect labelRect,  const wxVariant& value) override
    {
        wxTextCtrl* text = new wxTextCtrl(parent, wxID_ANY, value, labelRect.GetPosition(), labelRect.GetSize(), wxTE_PROCESS_ENTER);
        text->SetInsertionPointEnd();

        return text;
    }
    virtual bool
    GetValueFromEditorCtrl(wxWindow* ctrl, wxVariant& value) override
    {
        wxTextCtrl* text = wxDynamicCast(ctrl, wxTextCtrl);
        if ( !text )
            return false;

        value = text->GetValue();

        return true;
    }
private:
    wxString m_value;
};
  1. 覆盖渲染方法
 bool MyColorRenderer::Render( wxRect rect, wxDC *dc, int state )
    {
        dc->SetBrush( wxColour(m_value) );
        rect.Deflate(2);
        dc->DrawRoundedRectangle( rect, 5 );
        return true;
   }
  1. 根据需要创建单元格

lst-> AppendColumn(新wxDataViewColumn(“ Colore”,新 MyColorRenderer(wxDATAVIEW_CELL_INERT),5,60,wxALIGN_CENTER));