gpt4 book ai didi

c++ - 来自 wxEvtHandler 的派生类的回调永远不会被调用

转载 作者:行者123 更新时间:2023-11-28 05:16:57 27 4
gpt4 key购买 nike

我有一个派生自 wxEvtHandler 的类。它创建一个按钮并绑定(bind)一个“点击”回调。这个回调永远不会被调用。如果我在 wxFrame 中创建相同的按钮,一切正常。我错过了什么吗?提前致谢。

#include <wx/wx.h>

const int ID1 = 1;
const int ID2 = 2;

struct Derived : public wxEvtHandler
{
Derived(wxFrame* frame)
{
auto btn = new wxButton(frame, ID1, "A", wxPoint(10, 20));
Bind(wxEVT_COMMAND_BUTTON_CLICKED, &Derived::Click, this, ID1);
}

void Click(wxCommandEvent& ev)
{
auto dial = new wxMessageDialog(0, "Button B does not works fine!", "", wxOK);
dial->ShowModal();
}
};

struct MainFrame : public wxFrame
{
MainFrame() : wxFrame(NULL, wxID_ANY, "")
{
auto pane = new Derived(this);

auto btn = new wxButton(this, ID2, "B", wxPoint(10, 50));
Bind(wxEVT_COMMAND_BUTTON_CLICKED, &MainFrame::Click, this, ID2);

}

void Click(wxCommandEvent& ev)
{
auto dial = new wxMessageDialog(0, "Button B works fine!", "", wxOK);
dial->ShowModal();
}
};

struct Application : public wxApp
{
virtual bool OnInit()
{
auto simple = new MainFrame();
simple->Show(true);
return true;
}
};

IMPLEMENT_APP(Application)

最佳答案

使用btn->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &Derived::Click, this, ID1);

基本原理是这样的:当按钮想要处理点击事件时,它会调用 GetEventHandler() 来查找绑定(bind)的处理程序(Click()在你的代码中)。但是 GetEventHandler() 返回其父级(一个 wxFrame)事件处理程序,该处理程序绑定(bind)“Click”。所以什么都不做。

在调用 之前使用 btn->SetEventHandler(this);btn->PushEventHandler(this); 将 Derived 设置为处理程序Bind() 使GetEventHandler() 返回具有Click 处理程序的Derived,然后处理事件。
但是另一个问题出现了:当按钮被删除时,它的所有事件处理程序必须在之前弹出(否则一些未决事件可能会保留悬空的删除指针)。这个问题迫使您在删除按钮时调用 PopEventHandler()...忘记所有这些并使用 btn->Bind(...)

关于c++ - 来自 wxEvtHandler 的派生类的回调永远不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42447663/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com