在wxWidgets的事件中包含我自己的数据的最佳方法是什么?
What is the best way to include my own data in an event in wxWidgets?
我正在尝试实现类似文件的结构。文件和文件夹名称显示在列表框中。
我想向 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
,但您必须自己清理任何动态创建的对象。
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 检测win32服务创建和删除的最佳方法
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 将线程中的数据存储到全局容器的最佳方法?
- 将一系列整数放入类的最佳方法是什么?
- 在派生类中使用基类的私有成员变量的最佳方法
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 比较两个节点坐标的最佳方法是什么?
- 在nodejs中使用本机代码的最佳方法是什么?
- 将 pybind11 绑定标记为已弃用的最佳方法
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- C++中变量混叠的最佳方法
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?