c++ - 事件 wxWidgets

标签 c++ user-interface wxwidgets

我想了解如何完成特定任务。我试图在 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 在 header 中声明该表。

最佳答案

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

(重新)阅读 the event handling overview强烈推荐。

关于c++ - 事件 wxWidgets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14073518/

相关文章:

c++ - 尝试将数字乘以索引

c++ - 代码覆盖率中编译器生成的代码

user-interface - 本地桌面应用程序的浏览器 GUI?

c++ - wxwidgets:使用 CMake 链接到 wxMediaCtrl

c++ - 无法使用 wxWidgets 为工具栏获取合适的 Vista/7 主题

c++ - 自修改代码 [C++]

c++ - 在没有共享 COM 对象的情况下使用 COM STA 或 MTA?

python - [Python 2.7]使用pygame在窗口内输入shell?

android - 何时使用更多 Activity

c++ - C :B compiler issue with wxwidgets project