在wxWidgets的事件中包含我自己的数据的最佳方法是什么?

What is the best way to include my own data in an event in wxWidgets?

本文关键字:最佳 方法 是什么 数据 包含我 wxWidgets 事件 自己的      更新时间:2023-10-16

我正在尝试实现类似文件的结构。文件和文件夹名称显示在列表框中。

我想向 ListBox 条目添加其他数据 - 现在它只有它的字符串,我希望它有一个布尔值来区分文件夹和文件,所以当我双击并调用我绑定到此事件OnDoubleClick(wxCommandEvent&)方法时,我可以访问其他数据。

我知道我可以创建自定义事件或子类现有事件,但如何自定义列表框以保存更多数据?

wxListBox源自wxItemContainer,这意味着它允许每个项目保存额外的数据。例如,可以定义如下所示的客户端数据类:

class MyClientData:public wxClientData
{
public:
enum ItemType
{
ItemTypeInvalid,
File,
Folder
};
MyClientData(ItemType it):m_itemType(it){}
ItemType GetItemType() const{return m_itemType;}
private:
ItemType m_itemType;
};

然后,在将客户端数据追加到控件时,可以将客户端数据附加到列表框项,如下所示:

listbox->Append("Folder 1", new MyClientData(MyClientData::Folder));
listbox->Append("Folder 2", new MyClientData(MyClientData::Folder));
listbox->Append("File 1", new MyClientData(MyClientData::File));
listbox->Append("File 2", new MyClientData(MyClientData::File));
listbox->Append("File 3", new MyClientData(MyClientData::File));
listbox->Append("File 4", new MyClientData(MyClientData::File));
listbox->Append("No Client Data 1");

由于 MyClientData 派生自 wxClientData,因此列表框将取得客户端数据对象的所有权,并在其析构函数中或在从控件中删除项时删除它们。

可以在OnDoubleClick方法中恢复客户端数据(假设该方法正在处理列表框的wxEVT_LISTBOX_DCLICK事件(,如下所示:

void xxx::OnDoubleClick(wxCommandEvent& event)
{
int itemNo = event.GetSelection();
wxListBox* listBox = wxDynamicCast(event.GetEventObject(), wxListBox);
MyClientData* clientData = NULL;
if ( listBox != NULL && itemNo != wxNOT_FOUND )
{
clientData=static_cast<MyClientData*>(listBox->GetClientObject(itemNo));
}
... do something with clientData here ...
}

最后,正如 Igor 所说,我不确定 wxListBox 是在这里使用的最佳控件。 wxListCtrl 或 wxDataViewListCtrl 可能会看起来更好。这些控件稍微复杂一些,并且不是从 wxItemContainer 派生的。但是,您仍然可以附加额外的数据,例如wxListCtrl::SetItemPtrData,但您必须自己清理任何动态创建的对象。