wxDialog работает нормально, но вызов wxFileDialog приводит к тому, что программа не завершается - PullRequest
1 голос
/ 06 мая 2011

Аналогичная проблема в прошлый раз.Я запускаю код, выход из него.Графический интерфейс исчезает, и кажется, что он полностью завершен, но я проверяю свой список процессов, и код там все еще хранит память.

Я сузил его до вызова wxFileDialog.Я не понимаю, что я делаю неправильно, потому что я звоню так же, как звоню в wxDialog.Вызов wxDialog не приводит к этой проблеме, но wxFileDialog вызывает ее.

Работает нормально:

// Help Dialog
void MyFrame::OnHelp(wxCommandEvent& WXUNUSED(event))
{
    wxBoxSizer *topsizer;
    wxHtmlWindow *html;
    wxDialog dlg(this, wxID_ANY, wxString(_("Help")));

    topsizer = new wxBoxSizer(wxVERTICAL);

    html = new wxHtmlWindow(&dlg, wxID_ANY, wxDefaultPosition,
    wxSize(380, 160), wxHW_SCROLLBAR_NEVER);
    html->SetBorders(0);
    html->LoadPage(wxT("data/help.html"));

    // Fit the HTML window to the size of its contents
    html->SetSize(html->GetInternalRepresentation()->GetWidth(),
                html->GetInternalRepresentation()->GetHeight());

    topsizer->Add(html, 1, wxALL, 10);

    wxButton *but = new wxButton(&dlg, wxID_OK, _("OK"));
    but->SetDefault();

    topsizer->Add(but, 0, wxALL | wxALIGN_RIGHT, 15);

    dlg.SetSizer(topsizer);
    topsizer->Fit(&dlg);

    dlg.CentreOnParent();
    dlg.ShowModal();
}

Вызывает проблему:

void MyFrame::OnVidFile(wxCommandEvent& WXUNUSED(event))
{
    wxString caption = wxT("Choose a file");
    wxString wildcard = wxT("AVI files (*.avi)|*.avi");
    wxString defaultDir = wxGetHomeDir();
    wxString defaultFilename = wxEmptyString;

    wxFileDialog dialog(this, caption, defaultDir, defaultFilename, wildcard, wxOPEN | wxFILE_MUST_EXIST );
    dialog.CentreOnParent();

    if(dialog.ShowModal() == wxID_OK)       // problem
        pathVid = dialog.GetPath().c_str();
}

Это приводит кпрограмма не завершается корректно, даже если я выкидываю диалог.Дестрой ();или dialog.Close ();в конце.Мне они кажутся похожими на вызовы диалогового класса?

Я что-то здесь упускаю?

1 Ответ

0 голосов
/ 08 мая 2011

Проблема в конфликте с OpenCV (в частности, HighGUI).

Чтобы избежать этой проблемы и проблемы с ошибкой OLE, переопределите виртуальный базовый класс инициализации WxWidgets следующим образом:

bool MywxApp::Initialize( int& argc, wxChar **argv ) 
{ 
  ::CoUninitialize(); 
  return wxApp::Initialize( argc, argv ); 
}
...