如何关闭wxWidget中的wxDialog?
How can Close wxDialog in wxWidget?
我花了很多时间研究这个问题如何关闭我从 wxDialog 构建的应用程序
我创建了两个按钮 OK 和 Exit,当我按下 Exit 或签署 App 的 [X] 信号时,我发出此错误
错误图片:
// The Queue of Event Table
BEGIN_EVENT_TABLE(AutoPokemonDlg, wxDialog)
EVT_BUTTON(wxID_OK, AutoPokemonDlg::OnOK)
EVT_BUTTON(wxID_EXIT, AutoPokemonDlg::OnExit)
EVT_CLOSE(AutoPokemonDlg::OnCloseWindow)
END_EVENT_TABLE()
// I create Event Handler
void AutoPokemonDlg::OnExit(wxCommandEvent& WXUNUSED(event))
{
Close(true);
}
void AutoPokemonDlg::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
{
Destroy();
}
and main Window, i use wxDialog to inherit my subclass is AutoPikachuDlg
////AutoPokemonDlg.h
class AutoPokemonDlg : public wxDialog
{
public:
// Constructor
AutoPokemonDlg(wxWindow* parent, const wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size);
~AutoPokemonDlg();
// Event handlers
void OnOK(wxCommandEvent& event);
void OnExit(wxCommandEvent& WXUNUSED(event));
void OnCloseWindow(wxCloseEvent& event);
protected:
private:
DECLARE_EVENT_TABLE()
};
//////AutoPokemonDlg.cpp
AutoPokemonDlg::AutoPokemonDlg(wxWindow* parent, const wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size)
: wxDialog(parent, id, title, pos, size)
{
//...
};
您没有展示如何创建和展示您的 AutoPokemonDlg
,但是如果您按照建议在堆栈上进行,例如像这样:
void SomeEventHandler(wxEvent&) {
AutoPokemonDlg dialog(...);
dialog.ShowModal();
}
那么您的代码将导致调用 delete &dialog
,这显然是错误的,因为这不是堆指针。发生这种情况是因为您从 OnCloseWindow()
处理程序中调用 Destroy()
—— 正因为这个原因,它不能用于模态对话框。
最简单的解决方法是完全删除您的 OnCloseWindow()
处理程序,这通常是不必要的,因为如果对话框有任何可用于关闭它的按钮,它无论如何都会关闭,例如 wxID_OK
或 wxID_CANCEL
。如果它没有为您自行关闭,可能是因为您在 OnCloseWindow::OnOk()
中做了一些奇怪的事情(您都没有显示)。如果你想让它关闭你的对话框,请从那里调用 EndModal()
来完成。
我花了很多时间研究这个问题如何关闭我从 wxDialog 构建的应用程序 我创建了两个按钮 OK 和 Exit,当我按下 Exit 或签署 App 的 [X] 信号时,我发出此错误
错误图片:
// The Queue of Event Table
BEGIN_EVENT_TABLE(AutoPokemonDlg, wxDialog)
EVT_BUTTON(wxID_OK, AutoPokemonDlg::OnOK)
EVT_BUTTON(wxID_EXIT, AutoPokemonDlg::OnExit)
EVT_CLOSE(AutoPokemonDlg::OnCloseWindow)
END_EVENT_TABLE()
// I create Event Handler
void AutoPokemonDlg::OnExit(wxCommandEvent& WXUNUSED(event))
{
Close(true);
}
void AutoPokemonDlg::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
{
Destroy();
}
and main Window, i use wxDialog to inherit my subclass is AutoPikachuDlg
////AutoPokemonDlg.h
class AutoPokemonDlg : public wxDialog
{
public:
// Constructor
AutoPokemonDlg(wxWindow* parent, const wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size);
~AutoPokemonDlg();
// Event handlers
void OnOK(wxCommandEvent& event);
void OnExit(wxCommandEvent& WXUNUSED(event));
void OnCloseWindow(wxCloseEvent& event);
protected:
private:
DECLARE_EVENT_TABLE()
};
//////AutoPokemonDlg.cpp
AutoPokemonDlg::AutoPokemonDlg(wxWindow* parent, const wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size)
: wxDialog(parent, id, title, pos, size)
{
//...
};
您没有展示如何创建和展示您的 AutoPokemonDlg
,但是如果您按照建议在堆栈上进行,例如像这样:
void SomeEventHandler(wxEvent&) {
AutoPokemonDlg dialog(...);
dialog.ShowModal();
}
那么您的代码将导致调用 delete &dialog
,这显然是错误的,因为这不是堆指针。发生这种情况是因为您从 OnCloseWindow()
处理程序中调用 Destroy()
—— 正因为这个原因,它不能用于模态对话框。
最简单的解决方法是完全删除您的 OnCloseWindow()
处理程序,这通常是不必要的,因为如果对话框有任何可用于关闭它的按钮,它无论如何都会关闭,例如 wxID_OK
或 wxID_CANCEL
。如果它没有为您自行关闭,可能是因为您在 OnCloseWindow::OnOk()
中做了一些奇怪的事情(您都没有显示)。如果你想让它关闭你的对话框,请从那里调用 EndModal()
来完成。