Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ wxWidgets应用程序在使用模态对话框时挂起_C++_Wxwidgets - Fatal编程技术网

C++ 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

我有一个简单的wxWidgets应用程序,在其中创建一个
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)
无法解决此问题,我需要此功能的原因是,我可以在初始化主窗口之前显示错误消息是的,但您没有在发布的代码中初始化主窗口。请参阅我的最新答案。