1

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

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

void TopRightPanel::OnSelChanged(wxTreeEvent& event)
{
    wxTreeItemId item = event.GetItem();
    TreeItemData* data = (TreeItemData *) GetItemData(item);

    if(data != NULL)
    {

        particleSystemManager->SetSelectedParticleSystem(data->particleSystem); 
    }

 }

这工作正常,并且具有预期的正确值。不过我的问题是它是自包含的,我希望层次结构中它上面的类读取treeCtrl的操作并对UI的所有方面进行更改所以我尝试了这个:

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); 

    }
}

现在,当调用 topRightPanel->GetItemData(data) 时,我得到一个未处理的异常。它使用的 topRightPanel 似乎没有更新,并且似乎在它在类的构造函数中实例化之前指向数据。无论如何我可以解决这个问题吗?

编辑:

我像这样声明事件表:

#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()

然后我使用 DECLARE_EVENT_TABLE 在标题中声明表。

4

2 回答 2

1

必须在事件表宏中使用与在BEGIN_EVENT_TABLE. IOW,您的处理程序必须在事件表中定义,Window而不是在TopRightPanel事件表中。由于树事件是wxCommandEvents,它们向上传播到父级,因此如果Window包含树控件,这将起作用。否则,例如,如果他们是兄弟姐妹,则必须Connect()按照另一个答案中的说明使用。

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

于 2012-12-30T13:21:38.607 回答
0

您没有显示如何连接此事件处理程序,但问题几乎肯定存在,而不是在您显示的代码中。如果您正在使用Connect(),请确保将指向Windowobject 的指针作为其最后一个参数传递,否则您最终会WindowTopRightPanelobject 上调用类的方法,这无疑会带来灾难性的后果。

如果您确定确实在正确的对象上调用了该方法,那么我看到的唯一其他解释是您没有topRightPanel在生成此类型的第一个事件之前进行初始化。如果是这种情况,最简单的解决方案是初始化指针NULL并在初始化代码的末尾正确设置它。当然,还要检查事件处理程序中的指针是否为非 NULL。

于 2012-12-29T12:32:33.787 回答