Events wxWidgets

Events wxWidgets

本文关键字:wxWidgets Events      更新时间:2023-10-16

我想了解如何执行特定任务。我试图在WXWIDGETS中设置事件表,并遇到了他们的行为问题。

我在一个类中设置了一些代码:

void TopRightPanel::OnSelChanged(wxTreeEvent& event)
{
    wxTreeItemId item = event.GetItem();
    TreeItemData* data = (TreeItemData *) GetItemData(item);
    if(data != NULL)
    {
        particleSystemManager->SetSelectedParticleSystem(data->particleSystem); 
    }
 }

这可以正常工作,并且具有预期的正确值。我的问题是它是自我包含的,我希望在层次结构中上方的类别阅读TreectRL的动作,并对U.I.I的各个方面进行更改。所以我尝试了:

void Window::OnSelChanged(wxTreeEvent& event)
{
    wxTreeItemId item = event.GetItem();
    TreeItemData* data = (TreeItemData *) topRightPanel->GetItemData(item);//item.m_pItem.//m_MyTreeCtrl->GetItemData(itemId);*/
    if(data != NULL)
    {
        particleSystemManager.SetSelectedParticleSystem(data->particleSystem); 
    }
}

现在,当调用potrightpanel-> getItemdata(数据)时,我会得到一个未经手的例外。它使用的最杰出的媒介似乎没有更新,并且似乎在数据构造函数中启动之前指向数据。无论如何,我可以解决这个问题吗?

编辑:

我像这样声明事件表:

#if USE_GENERIC_TREECTRL
BEGIN_EVENT_TABLE(TopRightPanel, wxGenericTreeCtrl)
#else
BEGIN_EVENT_TABLE(TopRightPanel, wxTreeCtrl)
#endif
EVT_TREE_SEL_CHANGED(TopRightPanel_Ctrl, Window::OnSelChanged)
END_EVENT_TABLE()
然后,我使用dectare_event_table在标题中声明表格。

you 必须BEGIN_EVENT_TABLE中使用的事件表宏中使用相同的类名。IOW,您的处理程序必须在Window事件表中定义,而不是在TopRightPanel事件表中定义。由于树事件为wxCommandEvents,因此它们会向上传播给父级,因此,如果Window包含树控件,则将起作用。否则,例如如果它们是兄弟姐妹,则必须使用另一个答案中指示的Connect()

(重新)强烈建议阅读事件处理概述。

您不显示如何连接此事件处理程序,但是问题几乎肯定存在,而不是在您显示的代码中。如果您使用的是Connect(),请确保将指针传递给Window对象作为其最后一个参数,否则您最终在Window对象上调用CC_9类的方法,并带有毫不奇怪的灾难性后果。

如果您确定确实在正确的对象上调用方法,那么我看到的唯一其他解释是,在生成此类型的第一个事件之前,您不会初始化topRightPanel。如果是这种情况,最简单的解决方案是初始化NULL指针并在初始化代码结束时正确设置。而且,当然,在事件处理程序中检查指针是非无效的。