Как закрыть wxDialog в wxWidget? - PullRequest
0 голосов
/ 02 апреля 2020

Я потратил много часов на изучение проблемы. Как закрыть приложение, что я создаю форму wxDialog Я создаю две кнопки ОК и Выход, когда я нажимаю Выход или подписываю [X] сигнал приложения, затем я выдаю эту ошибку

Изображение ошибки: enter image description here

  // 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)
    {
    //...
    };

1 Ответ

0 голосов
/ 03 апреля 2020

Вы не показываете, как вы создаете и показываете AutoPokemonDlg, но если вы делаете это в стеке, как рекомендуется, например, так:

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

, тогда ваш код приведет к вызову delete &dialog, что явно неверно, так как это не указатель кучи. Это происходит потому, что вы вызываете Destroy() из вашего обработчика OnCloseWindow() - по этой причине его нельзя использовать для модальных диалогов.

Самое простое решение - просто полностью удалить обработчик OnCloseWindow(), обычно это не нужно, так как диалог все равно закрывается, если у него есть какие-либо кнопки, которые можно использовать для его закрытия, например wxID_OK или wxID_CANCEL. Если он не закрывается для вас сам по себе, это может быть из-за того, что вы делаете что-то странное в вашем OnCloseWindow::OnOk() (чего вы не показываете ни того, ни другого). Если вы хотите, чтобы он закрыл ваш диалог, позвоните EndModal(), чтобы сделать это оттуда.

...