wxWidgets 应用程序在使用模态对话框时挂起

wxWidgets app hanging when using modal dialog

我有一个简单的 wxWidgets 应用程序,我在其中创建了一个 wxMessageDialog 然后显示它。

出于某种原因,当我从启动方法 return 时,应用程序将挂起。

代码如下:

bool App::OnInit()
{
    wxMessageDialog* dialog = new wxMessageDialog(NULL, "Message", wxMessageBoxCaptionStr, wxOK | wxCENTER | wxDIALOG_NO_PARENT);
    dialog->ShowModal();

    return true;
}

我试过在 dialog 上调用 EndModal() 但这没有任何区别。 我确实在 Python 中看到了一个引用这种情况的问题,但是使用 wxDIALOG_NO_PARENT 对行为没有影响

知道问题出在哪里吗?

您必须在 App::OnInit() 中创建主应用程序 window,但您没有这样做。如果不创建主 window,则必须 return false,而不是 true.

主要的 window 通常是从 wxFrame 派生的 class。你也可以使用 SetTopWindow() 让 wxWidgets 知道主要的 window 是什么。

bool App::OnInit()
{
  if (someErrorCondition)
  {
    ::wxMessageBox("Oh no!");
    return false; // Return false if an error occurs and you cannot create the main window.
  }
  else
  {
    wxFrame* frame = new wxFrame(nullptr, wxID_ANY, "Amazing App");
    ::wxGetApp().SetTopWindow(frame); // Optionally set the main window.
    frame->Show(); // Optionally show our main window.
    return true; // Return true if all is well.
  }
}

应用程序不会挂起,它只是一直运行,直到有人告诉它退出。通常它是在最后一个 window 关闭时由框架本身完成的,但是由于您没有任何 windows (对话框在 OnInit() returns 之前关闭,所以没有't count),这不会发生。 IE。这是按预期工作的,您究竟希望发生什么?

另请注意,您的代码中存在内存泄漏。模态对话框是 wxWidgets 破坏您提供给它的所有对象并且不被框架破坏的一般规则的一个例外。这是因为通常您根本不需要销毁它们,因为它们是在堆栈而不是堆上创建的:

    wxMessageDialog dialog(NULL, "Message", wxMessageBoxCaptionStr, wxOK | wxCENTER | wxDIALOG_NO_PARENT);
    dialog.ShowModal();