C++ wxWidgets应用程序在使用模态对话框时挂起
我有一个简单的wxWidgets应用程序,在其中创建一个C++ wxWidgets应用程序在使用模态对话框时挂起,c++,wxwidgets,C++,Wxwidgets,我有一个简单的wxWidgets应用程序,在其中创建一个wxMessageDialog,然后显示它 由于某种原因,当我从启动方法返回时,应用程序将挂起 代码如下: bool App::OnInit() { wxMessageDialog* dialog = new wxMessageDialog(NULL, "Message", wxMessageBoxCaptionStr, wxOK | wxCENTER | wxDIALOG_NO_PARENT); dia
wxMessageDialog
,然后显示它
由于某种原因,当我从启动方法返回时,应用程序将挂起
代码如下:
bool App::OnInit()
{
wxMessageDialog* dialog = new wxMessageDialog(NULL, "Message", wxMessageBoxCaptionStr, wxOK | wxCENTER | wxDIALOG_NO_PARENT);
dialog->ShowModal();
return true;
}
我曾尝试在对话框中调用EndModal()
,但没有任何区别。
我确实在Python中看到了一个问题,提到了这种情况,但是使用wxDIALOG\u NO\u PARENT
对行为没有任何影响
你知道问题出在哪里吗?你必须在App::OnInit()
中创建应用程序主窗口,但你不能这样做。如果不创建主窗口,则必须返回false
,而不是true
主窗口通常是从wxFrame
派生的类。您还可以使用SetTopWindow()
让wxWidgets知道主窗口是什么
bool应用程序::OnInit()
{
if(someErrorCondition)
{
::wxMessageBox(“哦,不!”);
return false;//如果发生错误并且无法创建主窗口,则返回false。
}
其他的
{
wxFrame*frame=新的wxFrame(nullptr,wxID_ANY,“神奇应用”);
::wxGetApp().SetTopWindow(框架);//可以选择设置主窗口。
frame->Show();//可以选择显示主窗口。
return true;//如果一切正常,则返回true。
}
}
您必须在App::OnInit()
中创建应用程序主窗口,但您不能这样做。如果不创建主窗口,则必须返回false
,而不是true
主窗口通常是从wxFrame
派生的类。您还可以使用SetTopWindow()
让wxWidgets知道主窗口是什么
bool应用程序::OnInit()
{
if(someErrorCondition)
{
::wxMessageBox(“哦,不!”);
return false;//如果发生错误并且无法创建主窗口,则返回false。
}
其他的
{
wxFrame*frame=新的wxFrame(nullptr,wxID_ANY,“神奇应用”);
::wxGetApp().SetTopWindow(框架);//可以选择设置主窗口。
frame->Show();//可以选择显示主窗口。
return true;//如果一切正常,则返回true。
}
}
应用程序没有挂起,它只是运行,等待有人告诉它退出。通常在最后一个窗口关闭时由框架本身完成,但由于您没有任何窗口(对话框在OnInit()
返回之前关闭,因此不算在内),因此不会发生这种情况。也就是说,这是工作的预期,你到底想发生什么
还要注意,代码中存在内存泄漏。模态对话框是wxWidgets销毁您提供给它的所有对象的一般规则的一个例外,并且不会被框架销毁。这是因为通常不需要销毁它们,因为它们是在堆栈上而不是在堆上创建的:
wxMessageDialog dialog(NULL, "Message", wxMessageBoxCaptionStr, wxOK | wxCENTER | wxDIALOG_NO_PARENT);
dialog.ShowModal();
应用程序没有挂起,它只是运行,等待有人告诉它退出。通常在最后一个窗口关闭时由框架本身完成,但由于您没有任何窗口(对话框在OnInit()
返回之前关闭,因此不算在内),因此不会发生这种情况。也就是说,这是工作的预期,你到底想发生什么
还要注意,代码中存在内存泄漏。模态对话框是wxWidgets销毁您提供给它的所有对象的一般规则的一个例外,并且不会被框架销毁。这是因为通常不需要销毁它们,因为它们是在堆栈上而不是在堆上创建的:
wxMessageDialog dialog(NULL, "Message", wxMessageBoxCaptionStr, wxOK | wxCENTER | wxDIALOG_NO_PARENT);
dialog.ShowModal();
调用SetTopWindow(dialog)
无法解决此问题,我需要此功能的原因是,我可以在初始化主窗口之前显示错误消息是的,但您没有在发布的代码中初始化主窗口。请参阅我的更新答案。调用SetTopWindow(dialog)
无法解决此问题,我需要此功能的原因是,我可以在初始化主窗口之前显示错误消息是的,但您没有在发布的代码中初始化主窗口。请参阅我的最新答案。