【问题标题】:How can Close wxDialog in wxWidget?如何在 wxWidget 中关闭 wxDialog?
【发布时间】:2020-04-02 17:09:49
【问题描述】:

我花了很多时间研究如何关闭应用程序我构建表单 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)
    {
    //...
    };

【问题讨论】:

  • 您使用的是模态对话框还是非模态对话框?
  • #Igor 我想创建一个模态对话框。
  • 您应该致电EndModal()。检查相应的文档...

标签: c++ wxwidgets


【解决方案1】:

您没有展示如何创建和展示您的 AutoPokemonDlg,但如果您按照建议在堆栈上进行操作,例如像这样:

void SomeEventHandler(wxEvent&) {
    AutoPokemonDlg dialog(...);
    dialog.ShowModal();
}

那么您的代码将导致调用delete &dialog,这显然是错误的,因为这不是堆指针。发生这种情况是因为您从您的 OnCloseWindow() 处理程序中调用了 Destroy() - 正是因为这个原因,它不能用于模式对话框。

最简单的解决方法是完全删除您的OnCloseWindow() 处理程序,这通常是不必要的,因为如果对话框有任何可用于关闭它的按钮,例如wxID_OKwxID_CANCEL,它就会关闭。如果它没有为您自动关闭,可能是因为您在 OnCloseWindow::OnOk() 中做了一些奇怪的事情(您也没有显示)。如果您希望它关闭您的对话框,请致电 EndModal() 从那里执行此操作。

【讨论】:

    猜你喜欢
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多