【问题标题】:How to close a wxDialog so it doesn't prevent program from exiting如何关闭 wxDialog 使其不会阻止程序退出
【发布时间】:2015-09-28 17:22:39
【问题描述】:

当我关闭所有窗口(框架/对话框)时,调试器会保持程序运行。这就是问题所在。
我希望程序在对话框关闭时关闭。

我想两者都做:
1. 以对话框作为主窗口运行程序,并在我关闭该对话框时退出程序。
2. 运行一个带有可以弹出一个或多个对话框的窗口框架的程序,并在所有对话框关闭后关闭该程序。 (目前,关闭表单会关闭所有对话框,但不会关闭应用程序)
如果只有一个框架,它会很好地关闭。

如何关闭(空父)对话框,以便在关闭所有窗口后它不会保持程序运行(消息循环运行)。我不需要对话框来导致程序退出,只是不阻止程序退出。

在下面的示例中,如果表单是一个对话框,或者如果从表单中创建一个对话框(ok 对话框)然后关闭,则程序会在所有窗口关闭的情况下继续运行。

class MyApp : public wxApp
{
    public:
    bool OnInit();
private:
    void OnAboutClicked(wxCommandEvent &evt);
    MyFrame1 *myF;
};
bool MyApp::OnInit()
{
    if (!wxApp::OnInit())
        return false;
    myF = new MyFrame1(NULL);
    myF->Show();
    return true;
}

这些没有帮助。

MyDialog1::~MyDialog1()
{
    //this->Destroy();
    //delete this;
}

【问题讨论】:

  • 阅读 wxWidgets 中的对话框以及有关对话框的几个类似问题。我读到程序将在所有(顶级)窗口关闭后结束。表单,是的,对话框,不是。我不知道到底是什么让程序继续运行。
  • 默认情况下,程序在最后一个顶级窗口、框架或对话框关闭时退出。如果需要,可以更改此设置,但我认为默认行为记录得很清楚。
  • This question 可能暗示我正在对话框上创建一些对象,并且那些(窗口)仍然存在(不被解构函数破坏)。我得看看我是孤立按钮还是什么。
  • 剩余说明:在打开多个 NULL 父对话框的情况下,关闭 MyApp 中创建的框架会隐藏这些对话框,因此很难关闭它们,这可能/将终止程序。

标签: c++ dialog wxwidgets


【解决方案1】:

这个问题是由对话框引起的,当顶层时,它的行为与顶层表单不同。更改对话框以在窗口关闭时自行销毁非常简单。您可以在窗口的 OnClose 事件中调用 delete this ,它就可以解决问题。只需要一个窗口来保持程序运行。

将函数(或其他)连接到关闭窗口事件

//this may be in the object constructor or other appropriate place
this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MyDialog1::OnClose ) );
//an example of a similar Bind call looks like
this->Bind(wxEVT_CLOSE_WINDOW, &MyDialog1::OnClose, this);

使用的函数或成员可以简单到 delete this;.

//located in the dialog class definition
virtual void OnClose(wxCloseEvent& event) { delete this; }

这表明对象/窗口没有被破坏。这种方法在不跟踪所有创建的对话框以及它们是无模式的时候很有用,因为每个对话框都会自行清理。这清理了保持程序运行的对象(不再有 UI 来关闭它们)。

注意:建议使用 Bind 而不是 Connect。有关基本原理,请参阅 Bind 上的 this wxWidgets 描述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多