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

标签 c++ events event-handling wxwidgets

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

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

我知道我可以创建自定义事件或对现有事件进行子类化,但我如何自定义 ListBox 以容纳更多数据?

最佳答案

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 是这里使用的最佳控件。 wxListCtrlwxDataViewListCtrl可能会更好看。这些控件有点复杂,并且不是从 wxItemContainer 派生的。然而,您仍然可以附加额外的数据,例如 wxListCtrl::SetItemPtrData,但是您必须自己清理任何动态创建的对象。

关于c++ - 在 wxWidgets 的事件中包含我自己的数据的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59102973/

相关文章:

c++ - 不调用复制构造函数

java - Vaadin 7 在组件之间触发自定义事件

events - 事件处理程序,事件监听器和事件注册是否都引用相同的内容?

javascript - jquery 延迟加载和其他 Jquery/javascript 函数在附加后不起作用

c++ - 如何从该对象中获取静态对象的值?

c++ - 如何对两个指针指向的变量使用 delete?

C++:显示控制台窗口的输出

ios - 贝塞尔路径的透明区域不允许用户交互

.net - Win32中如何编码.NET事件Application.OnIdle?

javascript - 嵌套 HTML 时如何控制 jQuery 事件?