wxDataViewListCtrl 和 wxVariant

wxDataViewListCtrl and wxVariant

我有一个简单的设置,一个 wxDataViewListCtrl,第一列使用 wxDataViewCustomRenderer,第二列只是文本。

class MyCustomRenderer : public wxDataViewCustomRenderer

我像这样向 wxDataViewListCtrl 添加一行:

wxVector<wxVariant> item;
item.push_back(wxVariant(/*a raw pointer of MyClass goes here*/));
item.push_back(wxVariant("some string goes here"));
m_data_view_list_ctrl->AppendItem(item);
item.clear();

这是我的班级:

class MyClass final : public wxObject

这就是我的 SetValue 方法的样子:

bool MyCustomRenderer::SetValue(const wxVariant& value)
{
    MyClass* temp = static_cast<MyClass*>(value.GetWxObjectPtr());

    /*Do stuff with temp here...*/

    return true;
}

以前有用,现在不行了。它失败并出现以下错误: https://www.dropbox.com/s/acxbzthp3ltadny/wxwidgets.png?dl=0

我唯一改变的是我将 wxWidgets 的静态库从 3.0.4 更新到 3.1.2。 为什么它停止工作了?我在这里错过了什么? 请帮助我:-)

更新

谢谢大家的回答。问题已解决 here。简而言之,我需要像这样更改此行:

MyCustomRenderer::MyCustomRenderer() : wxDataViewCustomRenderer("void*", wxDATAVIEW_CELL_INERT, wxALIGN_CENTER)

这个像这样:

item.push_back(wxVariant(static_cast<void*>(/*Raw pointer to an instance of MyClass*/)));

我不确定到底是哪个更改导致了这个问题,但是由您的模型为正在绘制的单元格编辑的值 return 为空,因此您的渲染器不能盲目地使用它并且应该在执行之前检查 if ( !value.IsNull() ) (在这种情况下可能只是 return 或者做任何适当的事情来显示你的情况下没有值)。