【问题标题】:What is the best way to include my own data in an event in wxWidgets?在 wxWidgets 的事件中包含我自己的数据的最佳方式是什么?
【发布时间】:2020-03-24 22:39:30
【问题描述】:

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

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

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

【问题讨论】:

  • 也许你应该看看 wxListCtrl?

标签: c++ events event-handling wxwidgets


【解决方案1】:

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,但您必须自己清理所有动态创建的对象。

【讨论】:

  • 谢谢,这看起来正是我想要的!另外我会检查 wxListCtrl 和 wxDataViewListCtrl,以后可能会派上用场。非常感谢!
猜你喜欢
  • 2011-06-18
  • 2023-03-11
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多